How to observe all object property changes?

前端 未结 3 510
迷失自我
迷失自我 2020-12-03 22:55

For arrays I know you can do something like this:

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

What I did was convert the object into an array

相关标签:
3条回答
  • 2020-12-03 23:38

    probably you could create something like a blabbermouth mixin and override the set method to get notified of property changes:

    App.BlabbermouthMixin = Ember.Mixin.create({
    
      set: function(keyName, value) {
        this.set('updatedProperty', keyName);
        this._super(keyName, value);
      }
    
    });
    

    and observe the updatedProperty property?

    0 讨论(0)
  • 2020-12-03 23:39

    You can observe isDirty to see if any of the object's values have been modified since last save (if you are using Ember Data).

    Alternatively you can pass a comma separated list of properties to observes. This might be long if you have a lot of properties on your object, but will work.

    A third approach could be to override setUnknownProperty() and set a property, a 'dirty flag' (or perform any action you may want in there.

    There's also an old SO post that gives the following answer:

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

    You could probably split this out into a Mixin to keep your code DRY.

    0 讨论(0)
  • 2020-12-03 23:44

    You can get a list of properties in an object and apply them to a new property:

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

    Here is a working jsbin. Creating an observer instead of a property should be possible using a similar approach.

    0 讨论(0)
提交回复
热议问题