我与 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')
});