2013-04-26 2 views
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/

+0

위 코드를 변경했습니다 .. var subjects = myModel.get ('subject'). slice(); subjects.push (2); 이게 제대로 작동하는 것 같은데, 맞습니까? – user1184100

답변

6

백본은 변화 이벤트를 트리거합니다. myModel.get('subject')은 배열에 대한 참조를 생성합니다. 그런 다음 myModel.set({"subject": subjects})으로 수정하고 설정하지만 동일한 참조입니다. 값은 변경되지 않았으므로 이벤트는 트리거되지 않습니다.

Cloning 또는 slicing 배열이 당신에게 동작을 줄 것이다 당신은 기대 :

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] 
     } 
    } 
});