我写了一个函数,只要模型属性发生变化就会触发它,如下所示。
modelEvents:{
"change:Name":"callback1"
},
callback1:function(){
console.log("This is testing");
}
最初我设置了 model.set("Name","hi")
以便自动调用 callback1
。再次,如果我在模型中设置相同的值,则 callback1
不会触发,因为模型属性未修改。所以为此每次我都会在下面做。
model.set({"Name":""},{silent:true});
model.set({"Name":"hi"});
如果我确实像上面那样工作正常,但我想知道是否有任何选项(例如silent
)来强制调用回调。
谢谢。
最佳答案
如果您想采用传递选项的路线,那么实现此目的的唯一方法是在模型中使用类似的方法重写 set 方法,尽管我还没有对此进行测试以确保它会不会产生意想不到的结果。
set: function(key, val, options) {
//call the origonal set so everything works as normal
Backbone.Model.prototype.set.call(this, key, val, options);
current = this.attributes, prev = this._previousAttributes;
if (typeof key === 'object') {
attrs = key;
options = val;
} else {
(attrs = {})[key] = val;
}
options || (options = {});
//new option to always trigger the change on an attribute
if (options.loud) {
for (var key in attrs) {
//if the value is the same as before trigger the change
//otherwise backbone will have already triggered the chage
if (_.isEqual(prev[key] , attrs[key])) {
this.trigger('change:' + key, this, current[key], options);
}
}
}
}
然后为了利用它调用正常集但传递loud: true
this.model.set({
name: "Hi"
}, {
loud: true
});
这是一个使用它的 fiddle http://jsfiddle.net/leighking2/ktvj0kgp/ 为了表明即使属性相同,事件也会被触发,我添加了一个名为 renders 的属性来显示它被调用的次数。
关于javascript - 如何强制调用模型事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25301881/