有没有一种方法可以监视对象的更改
Is there a way to monitor changes to an object?
您可以只监听对象的更改并做出反应吗?
好吧,根据您使用的域,您可以使用backbone.js-它有一个"模型"对象,您可以扩展并连接到当模型更改时由事件自动触发的回调-也就是说,您在模型上设置一个字段,它会自动激发一个您可以监听的事件。您必须定义您的模型来扩展它的model,并调用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 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);
};
您可以使用getter和setter对属性更改做出反应。约翰·雷西格写了一篇关于他们的伟大文章。
- js,对象's状态监视
- Angular js 监视带有 ng-repeat 的 Select 标签上的对象数组
- Javascript 对象监视
- 如何使用 sinon.js 来模拟/监视 javascript 函数中提到的对象
- 效率 - 设置间隔与对象监视
- 使用Jasmine监视没有对象的函数
- 监视包含特殊字符作为关键字的作用域对象
- 如何使用sinon.js监视预定义的对象
- 监视具有基于表单和非基于表单的属性的对象中的更改
- Vue.js:监视对象的动态更改
- 如何在未知的父作用域上监视对象
- AngularJS忽略被监视对象中的键,或者重写$watch监听器
- 找不到一个对象来监视start()
- 使在计算值中使用的可观察对象被监视,即使在上次计算中没有使用
- Javascript中的循环/监视对象的更新
- 将作用域对象传递给可以监视和更新它的服务
- 监视所有JavaScript对象属性(魔术getter和setter)
- 有没有一种方法可以监视对象的更改
- 使用watch.js取消监视对象的问题
- AngularJS -如何在多个控制器中共享监视对象