每次模型属性设置时都会监听

时间:2013-07-19 05:57:11

标签: backbone.js

我有一个像 -

这样的骨干模型
ModelA = Backbone.Model.extend({
   this.set("prop1",true);
})

和视图一样 -

ViewA = Backbone.View.extend({
      initialize : function(){
           this.listenTo(this.model,"change:prop1",this.changeProp1)l;
           this.model.set("prop1",true);
      },
      changeProp1 : function(){
          // callback doesn't call because I'm setting the same value
      }

});

var model1 = new ModelA();
var view1 = new ViewA({model:model1});

这里回调changeProp1会在prop1从更改时触发 - > false - >真的。 但每当我设置相同的值或不同的值时,我都想听。

2 个答案:

答案 0 :(得分:2)

我说最好单独离开change事件,并实施新的set事件(或任何你想要的事件)。毕竟,您希望收到有关严格更改的事项的通知。

您可以在模型中实现自己的set()版本,该版本会触发自定义的“{1}}”。事件,然后调用骨干常用的设置方法。

var MyModel = Backbone.Model.extend({
    set: function(key, val, options) {
        // Deal with single name/value or object being passed in
        var changes;
        if (typeof key === 'object') {
          changes = key;
          options = val;
        } else {
          (changes = {})[key] = val;
        }

        options || (options = {});

        // Trigger 'set' event on each property passed in
        for (var i = 0, l = changes.length; i < l; i++) {
            this.trigger('set:' + changes[i], this, this.attributes[changes[i]], options);
        }

        // Call the usual backbone 'set' method
        Backbone.Model.prototype.set.apply(this, arguments);
    }
});

然后聆听您的新活动,而不是(或更改)&#39;更改&#39;,在适当情况下:

ViewA = Backbone.View.extend({
  initialize : function(){
       this.listenTo(this.model,"set:prop1",this.changeProp1)l;
       this.model.set("prop1",true);
  },

但是,大部分代码都是从Backbone的默认set方法中解除的,并没有处理其他一些问题,例如某些选项标记和嵌套事件。如果您想更改Backbone源本身,您要查找的行是:

if (!_.isEqual(current[attr], val)) changes.push(attr);

(版本1.0.0中的第347行)并尝试删除if子句。

(上面的代码未经过测试,对于任何语法错误感到抱歉)

答案 1 :(得分:0)

为了实现上述功能,您必须在backbone.js中对change函数进行更改。如果是,则更改检查属性的值是否更改,而不仅仅是它调用绑定的函数。