好吧,根据您正在使用的域,您可以使用backbone.js - 它有一个"模型"对象,您可以扩展并连接到在模型更改时自动由事件触发的回调 - 也就是说,您在模型上设置了一个字段,它将自动触发您可以收听的事件.您必须定义模型以扩展其模型,并调用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';
Run Code Online (Sandbox Code Playgroud)
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;
};
Run Code Online (Sandbox Code Playgroud)
以下是基于"魔术"设置器进行广播的示例:
Model.prototype.set = function(key, val) {
this.attribs[key] = val;
this.emit('change', this.attribs);
type = key + '.change';
this.emit(type, val);
};
Run Code Online (Sandbox Code Playgroud)
这是一个简化的示例,因为我在混合中引入了"属性中间件",但这显示了如何根据属性更改发出更改事件.
| 归档时间: |
|
| 查看次数: |
4603 次 |
| 最近记录: |