在backbone.js中,我注意到change
上的all
和Model
事件如果set
模型的属性属于其现有属性,则不会触发。
例如,如果我设置了以下事件:
ActiveUser.bind('change', this.displayActiveUser, this);
ActiveUser.bind('all', this.displayActiveUserAll, this);
然后我手动将ActiveUser的值设置为空字符串:
ActiveUser.set({ text : '' });
当且仅当ActiveUser.text
尚未设置为空字符串时,事件才会触发。
这是合理的行为。但是,即使设置的值是现有值,我可以使用的事件是否会触发?
更新:官方Backbone.js list of events中没有看到任何内容。 HMM。
答案 0 :(得分:8)
您始终可以使用ActiveUser.trigger('change');
手动触发更改事件。
答案 1 :(得分:3)
亚伯拉罕说,手动触发改变事件
MyModel.trigger('change')
因此可以手动触发更改事件,但在某些情况下无法正常工作。考虑一下当你的渲染方法从模型获取属性并且你的模型最初为空时的情况,所以如果你的代码在模型上设置了一些东西并且在那行之后你直接说MyView.render()
或MyModel.trigger('change')
那么你的渲染方法会发生什么可能会更快,甚至不会采用新设置的属性。
快速的hacky替代方案可能是每次你设置的东西,生成随机数并将其传递给模型:
MyModel.set({myProperty:something,rand:Math.random()});
或
MyModel.set({myProperty:something,t:(new Date).getTime()});
因此,在这种情况下,你确定模型总是会因为某些内容发生变化而触发更改事件,但它很糟糕,如果你有很多事情发生,那么你的应用程序将成为随机数字计算器。
或者选择Peter Lyons方法。
答案 2 :(得分:1)
好像你需要一个Backbone.Model子类,它是你想要这种行为的任何你自己的Model类的父类。沿着这些方向重写set
方法。仅在更改时触发事件的逻辑被编码为Backbone.Model.set
,其方式不容易支持添加新选项。
(...摘录...)
set: function(key, value, options) {
//Handle both "key", value and {key: value} -style arguments.
if (_.isObject(key) || key == null) {
options = value;
}
this.change(options); //This fires the event
Backbone.Model.prototype.set.apply(this, arguments);//Trigger normal behavior as well