2

我与 Ember 的财产观察员一起经历了一些不寻常的行为。请参阅此 jfiddle 以了解实际代码:http: //jsfiddle.net/sBVtJ/3/

  1. 当观察者监视两个属性时,当两个属性同时更新时,它将被触发两次。
  2. 当在控制器上为另一个路由设置观察者时,它不会开始触发,直到该路由处于活动状态(预期)。但是当离开那条路线时,观察者会继续开火(不是故意的)。

关于行为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')
});
4

1 回答 1

1

对于第一部分,使用Ember.beginPropertyChanges()and Ember.endPropertyChanges()。有关更多信息,请参阅此 SO 答案

Ember.beginPropertyChanges();
this.get('controllers.application').incrementProperty('prop1');
this.get('controllers.application').incrementProperty('prop2');
Ember.endPropertyChanges();

对于第二种行为,它需要更多的研究。我认为ObserverController在您访问观察者路线之前不会创建,但是当您离开路线时,它不会被破坏..

于 2013-02-08T07:15:55.860 回答