骨干模型改变不发射

时间:2013-04-26 09:48:48

标签: javascript backbone.js

我已经粘贴了下面的代码,当数据被推入模型中已经存在的数组时,'on change'没有触发,但是当整个数组被重置时,它会被触发。

var BookModel = Backbone.Model.extend({
  defaults : {
    "subject" : [0,4]   
  },

  initialize : function() {
    this.on('change',this.fetchResults);
  },

  fetchResults : function() {
    console.log("fetch");
  }

});

var myModel = new BookModel();
var subjects = myModel.get('subject');
subjects.push(2);  //fetch does not get called 
//subjects = [];   //fetch gets called 
myModel.set({"subject": subjects});

小提琴:http://jsfiddle.net/WnNQk/

1 个答案:

答案 0 :(得分:6)

当值实际更改时,Backbone会触发更改事件。 myModel.get('subject')产生对数组的引用。然后,您使用myModel.set({"subject": subjects})修改并设置它,但它是相同的引用:值未更改,事件未被触发。

Cloningslicing数组会为您提供您期望的行为:

var subjects = _.clone(myModel.get('subject'));
subjects.push(2);
myModel.set({"subject": subjects});

var subjects = myModel.get('subject').slice();
subjects.push(2);
myModel.set({"subject": subjects});

在相关的说明中,使用默认值中的数组将导致实例之间的共享数组。在这种情况下,我建议使用函数来构建默认值:

var BookModel = Backbone.Model.extend({
    defaults: function() {
        return {
            "subject": [0, 4]   
        }
    }
});