2012-07-24 107 views
4

在Ember.js中,是否有添加觀察者的好方法,該觀察者將觀察Ember.Object的子類實例上的所有更改?ember.js所有值的觀察者

(CoffeeScript的)

Bat = Ember.Object.extend 
    name: null 
    age: null 

hank = Bat.create 
    name: 'Hank' 
    age: 2 

#Something like this 
hank.addObserverToAll myClass, 'handleChange' 
+0

這可能有所幫助:http://stackoverflow.com/questions/9193712/how-do-i-observe-all-property-changes-on-a-model-object – Rajat 2012-07-24 06:18:17

+0

謝謝!但看起來那個可憐的傢伙從來沒有得到好的答覆......而他在5個月前問道。 :( – wmarbut 2012-07-24 13:15:37

+0

@Rajat也鏈接在那篇文章看起來不再有效或當前版本的燼 – wmarbut 2012-07-26 18:23:33

回答

5

這是一個實現:​​3210

App = Ember.Application.create(); 

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

App.watched = App.WatchedObject.create({ 
    firstProp:"foo", 
    plop: function(){}, 
    thirdProp: 'far' 
}); 

App.watched.set('firstProp', 'trigObserver'); 
App.watched.set('secondProp', 'doesNotTrigObserver'); 
App.watched.set('thirdProp', 'alsoTrigObserver'); 

正如你所看到的,它只能處理性能,而不是功能(我認爲這是你想要的)。
您也可以認識到,它只適用於傳遞給create()方法的屬性,而不適用於類定義中指定的屬性(即使用extend)。

+0

謝謝男人,希望Ember本機處理它,但這是一個優雅的解決方案! – wmarbut 2012-07-27 21:27:51

+0

NB它只觀察屬性不是在類定義中指定的那些(使用'extend')。 – louiscoquio 2012-08-20 17:53:47

+0

是的,這就是我在代碼下面的評論中所說的,但似乎並不清楚,我更新了。謝謝@louiscoquio – 2012-08-20 20:58:41