1

我在下面粘贴了我的代码,当数据被推入模型中已经存在的数组时,“更改时”不会触发,但是当整个数组被重置时,它会被触发。

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/

4

1 回答 1

6

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

克隆切片数组将为您提供您期望的行为:

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]   
        }
    }
});
于 2013-04-26T10:08:27.453 回答