2014-03-13 48 views
4

對於數組我知道你可以做這樣的事情:如何觀察所有對象屬性更改?

function() { 
}.observes("[email protected]") 

我所做的就是將對象轉換成一個數組,並觀察了@each屬性,但有沒有更好的辦法來觀察對象的所有屬性無需將其轉換爲數組?

+0

函數(){} .observes(「array。@ each」)實際上工作嗎?根據這裏的答案,沒有辦法觀察數組中的任何屬性:http://stackoverflow.com/a/24893070/188740 –

+0

它實際上已經有一段時間了,因爲我已經使用了這種觀察者,但我確實記得它工作正常。它的行爲必須與數組相同。[] from kingpin2k的回答 – Jaime

回答

3

您可以觀察isDirty以查看自從上次保存以來是否有任何對象的值已被修改(如果您正在使用Ember數據)。

或者,您可以將逗號分隔的屬性列表傳遞給observes。如果你的對象有很多屬性,這可能會很長,但是會起作用。

第三種方法可以覆蓋setUnknownProperty()和設置屬性,一個「髒標誌」(或執行可能要在沒有任何行動

還有一個old SO post給出以下答案:

App.WatchedObject = Ember.Object.extend({ 
    firstProp: null, 
    secondProp: "bar", 

    init: function(){ 
    this._super(); 
    var self = this; 
    Ember.keys(this).forEach(function(key){ 
     if(Ember.typeOf(self.get(key)) !== 'function'){ 
     self.addObserver(key, function(){ 
      console.log(self.get(key)); 
     }); 
     } 
    }); 
    } 
}); 

你也許可以拆分此伸到一個mixin保持代碼DRY。

+1

1.不幸的是,弄亂isDirty標誌是不可靠的。一旦isDirty標誌被設置,它將不會被切換,直到它被保存。因此在切換真實和切換保存時切換的任何變化都不會被觀察到。 2.在整個觀測列表中發送不是DRY。我會不惜一切代價避免這種情況。 3.嗯,這最後一個可以工作,但我不是它的粉絲。我想要一些不需要設置標誌的東西。 – Jaime

+0

是的,我同意這些選項都不是理想選擇,但據我所知,Ember不能在本地處理。我發現了一箇舊的答案,並將其包含在 – chopper

0

也許你可以創造一些像blabbermouth混入並覆蓋set方法獲取通知財產變化:

App.BlabbermouthMixin = Ember.Mixin.create({ 

    set: function(keyName, value) { 
    this.set('updatedProperty', keyName); 
    this._super(keyName, value); 
    } 

}); 

並觀察updatedProperty屬性?

+0

以上,這將不會標記對同一財產的後續修改,直到該過程中另一個財產被更改。另外,你確定所有的財產更改都通過'set'進行嗎?如果我們使用'object.setProperties'改變對象的屬性呢?該方法是否在內部使用'set'? – Ernesto

0

您可以在對象中獲取屬性的列表並將其應用到一個新的屬性:

attrs = Ember.keys(observedObject); 
var c = Ember.computed(function() { 
    // Do stuff when something changes 
}) 
Ember.defineProperty(target, propertyName, c.property.apply(c, attrs)); 

這裏是一個工作jsbin。應該使用類似的方法創建一個觀察者而不是一個屬性。

相關問題