backbonejs model.set,在任何情况下触发事件

时间:2015-03-22 13:44:00

标签: events backbone.js

有没有办法强制改变:即使属性数据没有改变,也要用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

再次,即使值没有改变,有没有办法触发第二组? 谢谢你的时间。

2 个答案:

答案 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事件。没有选项可以覆盖此行为。您可以尝试以下方法之一:

  1. 更改Backbone源以覆盖此行为 - 删除检查。 (不推荐)
  2. 像Peter Wagener建议的那样覆盖Backbone.Model.set(...)
  3. 手动触发change事件:

    model.set('attribute', 2, {silent:true}); //Pass silent to prevent 2 change events if the attribute actually changed.
    model.trigger('change');