2012-04-02 2 views

답변

11

Ember.js는 바인딩, 관찰자 ​​등을 허용하는 RunLoop의 개념을 사용합니다.

예에서 문제는 (바운드) 속성을 설정하고 즉시 console.log을 통해 값을 가져 오는 경우 RunLoop을 트리거하여 변경 사항을 동기화하는 이벤트가 발생하지 않는다는 것입니다. RunLoop에 관한 2 개의 훌륭한 블로그 게시물이 있습니다 : Part 1Part 2. Sproutcore를 대상으로하지만 개념은 Ember.js와 거의 같습니다.

예제 작업을 수행하는 데는 두 가지 방법이 있습니다. Ember.run.sync()를 호출하는 문서 상태로서 Ember.run.sync()

통해

포스 동기화 ... 동기화 즉시 응용 프로그램의 모든 바인딩을 강제하는 유용한 방법이다. 이

가 뷰의 속성을 나타내는 도면

의 값을보기 ... 같은 코드가, http://jsfiddle.net/pangratz666/cwR3P/

App = Ember.Application.create({}); 
App.wife = Ember.Object.create({ 
    householdIncome: 80000 
}); 

App.husband = Ember.Object.create({ 
    householdIncomeBinding: 'App.wife.householdIncome' 
}); 

// force bindings to sync 
Ember.run.sync(); 

console.log(App.husband.get('householdIncome')); // 80000 

// Someone gets raise. 
App.husband.set('householdIncome', 90000); 

// force bindings to sync 
Ember.run.sync(); 

console.log(App.wife.get('householdIncome')); // 90000​ 

또는 두 번째 옵션가있다 볼 잎 모든 RunLoop 항목을 처리합니다. http://jsfiddle.net/pangratz666/Ub97S/

Java 스크립트 :

App = Ember.Application.create({}); 
App.wife = Ember.Object.create({ 
    householdIncome: 80000 
}); 

App.husband = Ember.Object.create({ 
    householdIncomeBinding: 'App.wife.householdIncome' 
}); 

// invoke function in 3000ms 
Ember.run.later(function() { 
    // someone gets a raise 
    App.husband.set('householdIncome', 90000); 
}, 3000);​ 

핸들 바 (뷰) : 뷰와

<script type="text/x-handlebars" > 
    Wifes income: {{App.wife.householdIncome}}<br/> 
    Husbands income: {{App.husband.householdIncome}} 
</script>​ 
+0

, 우리는 또한 Ember.run.sync()를 사용할 수 있지만, 단 하나의 호출은 필요하다. http://jsfiddle.net/akLVy/10/ –

+0

잘 했어, 클레멘스 - 매우 도움이 됐어! 나는 이것을 문서에서 훨씬 더 잘 설명 할 필요가 있다고 생각한다. 예제 중 하나가 "있는 그대로"실행되지 않으면 초보자를위한 훌륭한 소개가 아닙니다. –

+0

감사! 댄, 나는 완전히 동의 할 것이다. 이것은 워드 프로세서에서 업데이트해야합니다! – pangratz

3

Ember의 실행 루프에 로그 문 앞에 동기화 할 수 있도록 바인딩을 설정 한 후 Ember.run.sync();으로 전화해야합니다. 이것은 Ember와 함께 테스트하기위한 편리한 기술이지만 Ember 응용 프로그램 자체에서는 일반적으로 필요하지 않습니다.

관련 문제