Ember.js Property Observer异常行为

时间:2013-02-08 05:20:30

标签: ember.js

我正在与Ember的一个属性观察者经历一些不同寻常的行为。请参阅此jfiddle以获取代码:http://jsfiddle.net/sBVtJ/3/

  1. 当观察者观察两个属性时,当两个属性同时更新时,它将被触发两次。
  2. 当在另一条路线的控制器上设置观察者时,它将不会开始触发,直到该路线处于活动状态(预期)。但是当离开那条路线时,观察者将继续射击(不打算)。
  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')
    });
    

1 个答案:

答案 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,但是当您离开路线时,它不会被破坏..