有没有办法监视对象的变化?
相反,基于用户操作触发事件,你可以只听一个对象的变化,然后做出反应?
那么,根据您使用的域,您可以使用backbone.js – 它有一个“模型”对象,您可以扩展并连接到模型更改时自动触发事件的callback – 也就是说,你在模型上设置一个字段,它会自动触发你可以听的事件。 你必须定义你的模型来扩展它的模型,并调用setter函数,而不是直接设置属性,但是它是非常有用的,我推荐它。
只是为了清楚起见,事件是从模型中触发的 ,因此即使您以编程方式或在控制台中设置属性值,也会触发事件。
我写过这样的东西
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创buildgetter和settes 。 第二个是根据你的setter中的这些属性变化来“子类化”EventEmitter和广播事件。
跟踪显示了我如何为一组键设置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); };
这是一个简单的例子,因为我介绍了“属性中间件”,但是这显示了如何根据属性更改发出更改事件。
您可以使用getter和setter ro对属性进行更改。 约翰·雷西格(John Resig)写了很棒的文章 。