0

我有一个骨干模型,例如-

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});

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

4

2 回答 2

2

我会说最好不要理会该change事件,并实施一个新set事件(或您想调用的任何名称)。毕竟,您希望收到有关并非严格“更改”的事情的通知。

你可以在你的模型中实现你自己的版本,set()它会触发一个自定义的“set”事件,然后调用主干的常用 set 方法。

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);
    }
});

然后在适当的情况下收听您的新事件而不是(或以及)“更改”:

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子句。

(以上代码未经测试,如有语法错误,请见谅)

于 2013-07-19T14:29:17.653 回答
0

要实现上述功能,您必须更改主干.js 中的更改功能。Change 检查属性的值是否更改(如果是),而不是仅调用绑定函数。

于 2013-07-19T06:02:53.387 回答