2012-03-27 21 views
5

在backbone.js中,我注意到Model上的changeall事件如果set模型的属性为其现有属性,则不会触发。backbone.js:将属性设置为现有值时触发的模型事件?

例如,如果我设置了以下事件:

ActiveUser.bind('change', this.displayActiveUser, this); 
ActiveUser.bind('all', this.displayActiveUserAll, this); 

然后我手动ActiveUser的值设置为空字符串:

ActiveUser.set({ text : '' }); 

事件触发当且仅如果ActiveUser.text尚未设置为空字符串

这是合理的行为。但是,即使设置的值是现有值,是否还有可以使用的事件?

更新:我没有看到任何东西在官方Backbone.js list of events。嗯。

+2

你可以随时手动运行'ActiveUser.trigger('change')' – abraham 2012-03-27 16:13:00

+0

谢谢 - 这就是我要做的! – Richard 2012-03-27 16:19:44

+0

我添加了我的评论作为答案。 – abraham 2012-03-27 16:35:19

回答

8

您可以随时与ActiveUser.trigger('change');手动触发更改事件。

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 
3

触发更改事件手动亚伯拉罕说

MyModel.trigger('change') 

因此,它可以手动触发更改事件,但它不会在某些情况下工作。考虑一下当你的渲染方法从模型中获取属性并且你的模型最初是空的时候,所以如果你的代码在模型上设置了某些东西,并且直接在该行后面说MyView.render()MyModel.trigger('change')那么你的渲染方法可能会更快,甚至不会新设置的属性。

快速哈克替代可能是每一个你设置的东西时,产生沿随机数,并把它传递给模型:

MyModel.set({myProperty:something,rand:Math.random()}); 

MyModel.set({myProperty:something,t:(new Date).getTime()}); 

因此,在这种情况下,你确信模型将总是因为某些事情发生变化而引发变化事件,但它很冒险,如果你有很多事情发生,那么你的应用程序将成为随机数字计算器。

或者用彼得里昂方法。

+0

哈克的替代方案肯定有效,但一个直接的触发器比这个更明显。 – 2014-05-22 13:14:10

相关问题