有没有办法监控对象的更改?

时间:2011-06-02 15:18:48

标签: javascript jquery json node.js

相反,根据用户操作触发事件,您可以只监听对象的更改并做出反应吗?

3 个答案:

答案 0 :(得分:7)

嗯,根据您正在使用的域,您可以使用backbone.js - 它有一个“模型”对象,您可以扩展并连接到当模型为时自动由事件触发的回调更改 - 也就是说,您在模型上设置了一个字段,它将自动触发您可以收听的事件。您必须定义模型以扩展其模型,并调用setter函数而不是直接设置属性,但它非常有用,我推荐它。

为了清楚起见,事件在更改的模型中被激活,因此即使您以编程方式或在控制台中设置属性的值,它也会被触发。

答案 1 :(得分: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

挖掘所有来源可能有点太多了。这是一个解释:

我的项目的关键是两个概念。一种方法是使轨迹保持一组属性,并使用 defineGetter defineSetter 为每个属性创建getter和settes。第二个是“子类化”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;
  };

以下是基于“魔术”二传手广播的示例:

  Model.prototype.set = function(key, val) {
    this.attribs[key] = val;
    this.emit('change', this.attribs);
    type = key + '.change';
    this.emit(type, val);
  };

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

答案 2 :(得分:0)

您可以使用getter和setter ro对属性进行更改。 John Resig写了很多关于他们的文章article