2012-07-24 102 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