2013-09-10 3 views
0

Я обновляю свою кодовую базу от EmberJS-1.0-rc1 до EmberJS-1.0.Устранение неполадок EmberJS?

Многие из моих привязок больше не синхронизируются. Семантика должна была измениться, но я не могу понять, как, или что я должен делать вместо этого!

var Widg = Ember.Object.extend({ 
    init: function() { 
     this._super(); 

     console.log("aliasToValue is: ", this.get('aliasToValue')); 
     if (this.get('aliasToValue') != this.get('value')) { 
      throw "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')); 
     if (this.get('aliasToValue') != this.get('value')) { 
      throw "Ugh, after setting, they don't match"; 
     } 
    }, 
    value: "initial value", 
    aliasToValueBinding: "value" 
}); 

Widg.create(); // EXCEPTION: "Ugh, after setting, they don't match" 
+0

JSFiddle демонстрирует вопрос: http://jsfiddle.net/kxhUw/1/ – Seth

+0

возможно дубликат [Ember.bind не остается в синхронизации] (HTTP : //stackoverflow.com/questions/19121850/ember-bind-does-not-stay-in-sync) –

ответ

0

При добавлении 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?

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