2013-02-08 112 views
2

我遇到了一些與Ember屬性觀察員發生的不尋常行爲。請參見本jfiddle的代碼在行動:http://jsfiddle.net/sBVtJ/3/Ember.js屬性觀察者異常行爲

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

回答

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不是在你訪問觀察者路線之前創建的,但是當你離開路線時,它不會被破壞..

+0

Shimon:我有類似的問題。我嘗試了一切,包括與'Ember.run'溝通,但無濟於事。如果'hasChanged'方法在所有3完成更新後才執行一次,那將會很好:http://jsfiddle.net/V29Nu/1/ – Wildhoney

+0

@Wildhoney我不認爲你可以觀察到3(或更多1)不同的控制器作爲單個更改。 –