骨干模型改变不发射

use*_*100 1 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});
Run Code Online (Sandbox Code Playgroud)

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

nik*_*shr 6

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

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

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

要么

var subjects = myModel.get('subject').slice();
subjects.push(2);
myModel.set({"subject": subjects});
Run Code Online (Sandbox Code Playgroud)

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

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