有没有办法监控对象的变化?
Posted
技术标签:
【中文标题】有没有办法监控对象的变化?【英文标题】:Is there a way to monitor changes to an object? 【发布时间】:2011-09-07 04:13:48 【问题描述】:您是否可以仅根据用户操作触发事件并仅监听对象的更改并做出反应?
【问题讨论】:
***.com/questions/1029241/… 【参考方案1】:嗯,根据您正在使用的域,您可以使用backbone.js - 它有一个“模型”对象,您可以扩展并连接到回调,当模型更改时由事件自动触发 -也就是说,您在模型上设置一个字段,它会自动触发您可以收听的事件。你必须定义你的模型来扩展它的模型,并调用一个 setter 函数而不是直接设置属性,但它非常有用,我推荐它。
为了清楚起见,该事件会在更改时从模型中触发,因此即使您以编程方式或在控制台中设置属性的值也会触发该事件。
【讨论】:
谢谢马特,主干看起来是个不错的选择。【参考方案2】:我写过这样的东西。
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);
;
这是一个简化的示例,因为我在组合中引入了“属性中间件”,但这说明了如何根据属性更改发出更改事件。
【讨论】:
【参考方案3】:您可以使用 getter 和 setter 来对属性更改做出反应。 John Resig 写了很棒的article 关于他们。
【讨论】:
您还可以使用Proxy
object 来检测对象的更改。以上是关于有没有办法监控对象的变化?的主要内容,如果未能解决你的问题,请参考以下文章