【问题标题】:backbone.js: Model event that fires when setting attributes to existing values?骨干.js:将属性设置为现有值时触发的模型事件?
【发布时间】:2012-03-27 16:03:42
【问题描述】:

在backbone.js 中,我注意到Model 上的change 和all 事件如果您set 模型的属性对其现有属性不触发。

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

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

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

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

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

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

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

【问题讨论】:

  • 您可以随时手动运行ActiveUser.trigger('change')
  • 谢谢 - 我会这么做的!
  • 我添加了我的评论作为答案。

标签: javascript backbone.js


【解决方案1】:

您始终可以使用ActiveUser.trigger('change'); 手动触发更改事件。

【讨论】:

    【解决方案2】:

    如 abraham 所说,手动触发更改事件

    MyModel.trigger('change')
    

    因此可以手动触发更改事件,但在某些情况下效果不佳。考虑当您的渲染方法从模型获取属性并且您的模型最初为空的情况,因此,如果您的代码在模型上设置了某些内容,并且直接在您说MyView.render() 或MyModel.trigger('change') 之后,那么您的渲染方法可能会更快并且甚至不会采用新设置的属性。

    每次你设置一些东西,生成随机数并将其传递给模型时,可能是快速的替代方案:

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

    或

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

    因此,在这种情况下,您可以确定模型总是会因为某些变化而触发 change 事件,但它是 hacky,如果您有很多事情要做,那么您的应用将成为随机数计算器。

    或者使用 Peter Lyons 方法。

    【讨论】:

    • hacky 替代方案确实有效,但直接触发比这要明显得多。
    【解决方案3】:

    似乎您需要一个 Backbone.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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 2013-06-11
      • 2012-12-02
      • 2023-04-04
      • 2012-05-02
      • 1970-01-01
      相关资源
      最近更新 更多