При добавлении propertyABinding: propertyB
, в основном уголек создать наблюдателя для propertyA
и propertyB
, что в расписание Syncronization (установить значение propertyA
в propertyB
и наоборот) в sync
очереди. Поскольку эта синхронизация запланирована, она будет выполнена только в конце runloop. Таким образом, aliasToValue
не меняется:
this.set('value', "hello world");
this.get('value'); // return "hello world"
this.get('aliasToValue'); // return "initial value"
Вы можете сделать синхронизации очереди промывать вызов Ember.run.sync()
программно. Так что это сработает:
this.set('value', "hello world");
this.get('value'); // return "hello world"
Ember.run.sync(); // don't wait for the end of runloop, and make the sync here
this.get('aliasToValue'); // return "hello world"
Но для этой работы в вашем примере вам нужно внести некоторые изменения. В вашем случае вы устанавливаете свойства в функции init
. Но в функции init наблюдатели не увольняются. Таким образом, синхронизация не будет запланирована. Вы можете использовать on('init')
для выполнения изменений в объекте при инициализации:
...
didInit: function() {
// now the observes will trigger when a property change
}.on('init')
...
Ваш код обновлен будет следующим:
//the application
App = Ember.Application.create();
App.MyObject = Ember.Object.extend({
didInit: function() {
console.log("aliasToValue is: ", this.get('aliasToValue'));
if (this.get('aliasToValue') != this.get('value')) {
alert("This exception doesn't get hit...");
}
console.log("Setting value to 'hello world'");
this.set('value', "hello world");
// I would expect:
// this.get('value') == this.get('aliasToValue')
// but that doesn't seem to work anymore....
console.log("After settting, aliasToValue is: ", this.get('aliasToValue'));
Ember.run.sync();
if (this.get('aliasToValue') != this.get('value')) {
alert("Ugh, after setting, they don't match");
}
}.on('init'),
value: "initial value",
aliasToValueBinding: "value"
});
App.MyObject.create(); // EXCEPTION: "Ugh, after setting, they don't match"
И в jsfiddle http://jsfiddle.net/marciojunior/Bk7L9/
Конечно, Ember.run.sync()
как раз для использования в редких случаях, удаление будет заново обновлять ваши шаблоны и свойства, но при завершении runloop. Я использовал его, чтобы сразу увидеть связанное свойство.
Для получения дополнительной информации о runloop увидеть этот ответ What is Ember RunLoop and how does it work?
JSFiddle демонстрирует вопрос: http://jsfiddle.net/kxhUw/1/ – Seth
возможно дубликат [Ember.bind не остается в синхронизации] (HTTP : //stackoverflow.com/questions/19121850/ember-bind-does-not-stay-in-sync) –