有没有一种方法可以监控对象的更改?

6

你是否可以监听对象的变化并在发生变化时做出反应,而不是基于用户操作触发事件?


3
https://dev59.com/53NA5IYBdhLWcg3wQ7i4 - Matt Ball
3个回答

7
根据您处理的领域,您可以使用backbone.js - 它具有一个“model”对象,您可以扩展并连接到回调,这些回调会在模型更改时自动触发事件 - 也就是说,您设置模型上的一个字段,它将自动触发一个事件,您可以侦听该事件。您必须定义要扩展其Model的模型,并调用setter函数而不是直接设置属性,但它非常有用,我推荐使用。
仅为了清晰起见,事件从模型更改时触发,因此即使您以编程方式或控制台中设置属性的值,它也会被触发。

谢谢Matt,backbone看起来是一个很好的选择。 - fancy

5
我写了类似这样的东西。 https://github.com/jmoyers/mettle
person.on('name.change', function(val){
    // 'a new name was committed: Yolanda'
    console.log('a new name was committed: ', val)
});

person.name = 'Yolanda';

https://github.com/jmoyers/mettle/blob/master/src/model.coffee

如果你需要深入了解源代码,可能需要花费一些时间。以下是解释:

我的项目的关键是两个概念。一个是通过使用defineGetterdefineSetter为一组属性跟踪并创建getter和setter。第二个是“子类化”EventEmitter,在setter中基于这些属性更改广播事件。

Track展示了我如何为一组键设置getter/setter。

  Model.prototype.track = function(keys) {
    _.each(keys, __bind(function(key) {
      this.tracked.push(key);
      this.__defineGetter__(key, __bind(function() {
        return this.get(key);
      }, this));
      return this.__defineSetter__(key, __bind(function(val) {
        return this.set(key, val);
      }, this));
    }, this));
    return this;
  };

以下是如何基于“神奇”setter进行广播的示例:
  Model.prototype.set = function(key, val) {
    this.attribs[key] = val;
    this.emit('change', this.attribs);
    type = key + '.change';
    this.emit(type, val);
  };

这是一个简化的示例,因为我引入了“属性中间件”,但这展示了如何根据属性更改发出更改事件。


0

您可以使用getter和setter来响应属性更改。John Resig撰写了一篇关于它们的文章,非常棒。


你也可以使用Proxy对象来检测对象的变化。 - Anderson Green

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接