2012-04-02 3 views

ответ

11

Ember.js использует концепцию RunLoop для обеспечения привязок, наблюдателей и т. Д.

Проблема заключается в том, что, установив свойство (bound) и сразу получив значение через console.log, никакое событие не будет запущено, что вызовет RunLoop и, следовательно, синхронизирует изменения. Есть 2 отличных сообщения в блоге о RunLoop: Part 1 и Part 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.run.sync();, чтобы дать циклу запуска Ember возможность синхронизировать перед вашими заявлениями журнала. Это удобный метод для тестирования с Ember, но обычно это не требуется в самих приложениях Ember.

Смежные вопросы