如何观察所有对象属性的变化?

时间:2014-03-13 19:01:17

标签: object ember.js properties foreach

对于数组我知道你可以这样做:

function() {
}.observes("array.@each")

我所做的是将对象转换为数组并使用@each观察属性,但有没有更好的方法来观察对象的所有属性更改而不将其转换为数组?

3 个答案:

答案 0 :(得分: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以保持代码干净。

答案 1 :(得分:1)

可能您可以创建类似blabbermouth mixin的内容并覆盖set方法以获取有关属性更改的通知:

App.BlabbermouthMixin = Ember.Mixin.create({

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

});

并观察updatedProperty属性?

答案 2 :(得分: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。应该可以使用类似的方法创建观察者而不是属性。