2012-04-19 2 views
1

대화 상자가 초기화 될 때 모델 특성에 대한 개체 배열이있는 컬렉션을 초기화하면 어떻게됩니까? 그런 다음 사용자가 목록을 편집 할 수있는 대화 상자보기는 모델 세트를 호출하여 해당 모델 값을 업데이트합니다. 대화 상자의 확인 버튼을 클릭하면 백본이 컬렉션 생성/초기화 이후 변경된 모델 목록 만 가져 오는 방법을 제공합니까?constuction 이후에 변경된 컬렉션의 모델 목록을 얻는 방법

Model#previousAttributes 그러나 속지 않는에만 동안 적용 :

답변

3

유혹 보면 다양한 모델 방법이 있습니다 "change" 이벤트가 tr가되고 있습니다. iggered : 이벤트가 트리거 처리 된 후

Note that this method, and the following change-related ones, are only useful during the course of a "change" event.

는 그래서 그들은 쓸모없는.

당신이 어떤 모델을 변경했는지 추적해야한다고 생각합니다. 당신은

Any event that is triggered on a model in a collection will also be triggered on the collection directly, for convenience.

때문에 너무 많은 노력없이 콜렉션 자체에서이 작업을 수행 할 수 있습니다 및 컬렉션은 자신의 이벤트에 바인딩 할 수 있습니다. 예를 들어, 당신은 당신의 컬렉션에서이 같은 뭔가를 할 수 :

Backbone.Collection.extend({ 
    initialize: function() { 
     this.delta = { }; 
     this.on('change',​​​​​ this._a_model_has_changed); 
    }, 
    changed_models: function() { 
     return _.chain(this.delta).values(); 
    }, 
    _a_model_has_changed: function(m) { 
     this.delta[m.id] = m; 
    } 
}); 

는 그런 다음 collection.changed_models()를 호출하여 변경된 모델을 얻을 수 있습니다. 모델이 삭제되거나 서버와 동기화 될 때 this.delta를 업데이트 할 수 있도록 다른 이벤트도 수신해야합니다. 위의 그림은 단지 설명을위한 것입니다. 당신이 밑줄 개체를 반환하지 않은 경우 대신이를 사용할 수 있습니다 collection.changed_models().each(function() { ... })

changed_models: function() { 
    return _(this.delta).values(); 
} 

하지만 수있는 편리합니다.

데모 : http://jsfiddle.net/ambiguous/8PQh9/

당신은 또한 모델은 모델에 비슷한 세트를 통해 자신의 불결을 추적 할 수 있습니다. 그럼 당신은 이런 식으로 뭔가를 할 수 : 모델이 변경 된 경우

collection.filter(function(m) { return m.is_dirty() }); 

어디 물론, is_dirty 사실 반환합니다.