2013-04-26 108 views
1

我已经粘贴了下面的代码,当数据被推入模型中已有的数组时,'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/

+0

我修改上面的代码.. VAR科目= myModel.get(“主体”)切片()。 subjects.push(2);这似乎工作,这是正确的? – user1184100 2013-04-26 09:56:32

回答

6

骨干触发变化事件当值实际上改变。 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] 
     } 
    } 
});