我正在与Ember的一个属性观察者经历一些不同寻常的行为。请参阅此jfiddle以获取代码:http://jsfiddle.net/sBVtJ/3/
关于行为2的更多讨论:首次加载应用程序时,您可以单击“更改多个属性操作”,属性将开始递增。然而观察者并没有被解雇。现在导航到观察者路线。增加属性时,观察者将触发。然后导航回索引路径。观察员将继续解雇财产增量。现在,每次从任一路径递增属性时,都会触发观察者。我的预期行为是在观察者路线处于活动状态时仅让观察者触发。有没有办法实现这个目标?
我对行为的问题1:注意观察者在属性更新时会触发两次,即使它们是同时更新的。同时更新两个属性时,是否可以让观察者只触发一次?
App = Ember.Application.create();
App.Router.map(function(){
this.resource('observer');
});
App.Router.reopen({location:'none'});
App.ApplicationController = Ember.Controller.extend({
consoleProp: function(){
console.log(this.get('controllers.application.prop1'));
},
changeTwoProperties: function(){
this.get('controllers.application').incrementProperty('prop1');
this.get('controllers.application').incrementProperty('prop2');
},
prop1:0,
prop2:0
});
App.IndexController = Ember.Controller.extend({
needs: ['application'],
changeTwoPropertiesBinding: 'controllers.application.changeTwoProperties',
consolePropBinding: 'controllers.application.consoleProp'
});
App.ObserverController = Ember.Controller.extend({
needs: ['application'],
changeTwoPropertiesBinding: 'controllers.application.changeTwoProperties',
consolePropBinding: 'controllers.application.consoleProp',
theObserver: function(){
console.log('observer fired');
}.observes('controllers.application.prop1', 'controllers.application.prop2')
});
答案 0 :(得分:1)
对于第一部分,请使用Ember.beginPropertyChanges()
和Ember.endPropertyChanges()
。见this SO answer for more info
Ember.beginPropertyChanges();
this.get('controllers.application').incrementProperty('prop1');
this.get('controllers.application').incrementProperty('prop2');
Ember.endPropertyChanges();
对于第二种行为,它需要更多的研究。我认为在您访问观察者路线之前不会创建ObserverController
,但是当您离开路线时,它不会被破坏..