有没有办法强制改变:即使属性数据没有改变,也要用model.set()触发属性事件?
model.set('attribute', 2); // will trigger the change:attribute event
model.set('attribute', 2); // will not trigger again since the value has not changed
再次,即使值没有改变,有没有办法触发第二组? 谢谢你的时间。
答案 0 :(得分:2)
并非没有覆盖Backbone.Model.set(...)
。我从来没有需要这个功能......只有在事件发生变化时才会触发事件"我认为,设计鼓励事件传播的最佳实践。 但是你可以提供一种方法,以静默方式删除该值,然后立即再次设置它。
修改:根据下面的mu is too short
评论,您还需要处理setLoudly
被赋予属性哈希的可能性。因此需要处理单个属性和哈希的clearSilently
方法:
var MyModel = Backbone.Model.extend({
setLoudly: function(attr, value, options) {
this.unset(attr, { silent: true });
return Backbone.Model.prototype.set.call(this, attr, value, options);
},
clearSilently: function(attr) {
if (_.isString(attr)) {
this.unset(attr, { silent: true });
} else {
_.each(_.keys(attr), function(key) {
this.unset(key, { silent: true });
}, this);
}
}
});
var myModel = new MyModel({
foo: "bar",
baz: 4
});
myModel.set('foo', 'bar'); // <<=== No Event
myModel.setLoudly('foo', 'bar'); // <<=== One 'change change:foo' event
myModel.set({
foo: "bar",
baz: 4
}); // <<=== No Events
myModel.setLoudly({
foo: "bar",
baz: 4
}); // <<=== Will receive 'change change:foo change:baz'
如果您想在设置数据时始终使用该方法,只需将其命名为set
而不是setLoudly
,您应该做得很好。 YMMV。
答案 1 :(得分:1)
在Model上设置属性时,Backbone将基本检查新属性是否与当前属性不同,然后触发change事件。没有选项可以覆盖此行为。您可以尝试以下方法之一:
Backbone.Model.set(...)
。手动触发change
事件:
model.set('attribute', 2, {silent:true}); //Pass silent to prevent 2 change events if the attribute actually changed.
model.trigger('change');