2013-04-26 109 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] 
     } 
    } 
});