2014-01-17 2 views
4

필자는 백본에서 뷰와 모델을 연관 시켰습니다. 보기는 모델 변경 사항을 관찰하고 그에 따라 표시 영역을 변경합니다. 예 :하나의 핸들러에서 여러 백본 모델 변경을 처리하는 방법

var Part = Bacbone.Model.extends({ 
    defaults:{ 
    partId = null, 
    manufacturer: null, 
    manufactureDate: null, 
    type: null 
    } 
}); 

var PartsCollection = Backbone.Collection.extends({ 
    model:Part; 
)}; 

var Car = Backbone.Model.extends({ 
    defaults:{ 
     carModel: null, 
     carName: null, 
     color: null, 
     partsCollection: null 
    }, 
    //Overwite the parse method to fill partsCollection 
    parse: function(response){ 
     // creating partsCollection from response and adding an attribute 
     // response.partsCollection = new PartsCollection(); 
     retrun response; 
    } 
}); 

위 구조와 유사한 구조를 가지고 있습니다. 디자인 전략에서 모델 변경시 뷰 내용을 변경하고 있습니다.

이제 예를 들어 5000 부품 중 1000 부품으로 제조업체 'A'를 제조업체 'B'로 대체 할 경우. 이것은 내 견해를 수정해야하며 내 견해로는 모델 변경 이벤트를 듣고 있습니다. 1000 개 부품 수정으로 인해 1000 개의 변경 이벤트가 트리거됩니다.

제조업체 변경으로 인해 부품 모델의 'manufacturerDate'속성을 변경하고 'manufacturerDate'attr도 변경하면 1000 개의 다른 이벤트가 트리거됩니다.

내 생각에 이러한 많은 이벤트를 처리하는 것이 내가 생각하는 좋은 생각이 아닐 수도 있습니다. 아무도 나에게이 문제를 해결하는 방법을 제안 할 수있다.

+0

완전히 잘못하고 있습니다! 같은 시간에 1000 가지가 왜 변하는가?! 최종 사용자가 모든 것을 한 곳에서 볼 수 있습니까? 나는 todomvc (1000 + todos)로 매우 무거운 테스트를 작성했고 angularjs가이 경우 다른 것보다 매우 빠르다는 아이디어를 생각해 내었습니다. 나는 또한이 경우에 대한 프로젝트를 시작했다. (Lilith.js, 아직 준비된 백본 포크는 아니지만 여전히 아이디어를 얻을 수있다!). Btw, 나는 3 가지 옵션을 추천 할 수있다 : react.js 또는 다른 프레임 워크를 사용하고, 필요에 따라 다른 바인딩 방식 또는 라이브러리를 사용한다. 1000 번 변경하지 마라! –

답변

0

이것이 올바른 방법 일지 모르지만 다음과 같은 해결책이있다. 부품 번호 모델을 CarView에서 직접 청취하지 마십시오. 대신 에 Carview을 추가하여 change:manufacturer 이벤트에 대한 수신기를 추가 할 수 있습니다. 자동차 모델 this.model.partsCollection에 있습니다. API (changeManufacturer)를 컬렉션에 추가하여 배열의 파트 (또는 부분 ID)와 새로운 제조업체 세부 정보를 받아들입니다. API는 부품 제조업체를 업데이트하고 이벤트를 트리거합니다. change:manufacturer 한 샷으로 부품 제조업체를 변경하려는 코드는 컬렉션 API changeManufacturer을 사용하고 CarView는 change:manufacturer 이벤트를 수신하고 자체 업데이트 할 수 있습니다.

var CarView = Backbone.View.extend({ 
    initialize: function() { 
     // do other stuffs 
     this.listenTo(this.model.partsCollection, "change:manufaturer", manufacturereChanged); 

    }, 

    manufacturereChanged: function(arrOfChangedParts) { 
     // you now have all changed parts array 
     // process as your logic 
    } 
}); 


var PartsCollection = Backbone.Collection.extend({ 
    model: Part, 
    changeManufacturer: function(arrPartIds, newManfacturerDetails) { 
     var arrChangedModels = []; 
     // iterate over ids 
      // get the model and change manufacturer info in model 
      // add changed model to arrChangedModels 
     // ends loop 

     // once all models are changed trigger an event "change:manufacturer" 
     this.trigger('change:manufacturer', arrChangedModels) 
    } 
}); 
0

컬렉션은 이전 컬렉션에서 차이와 새 값을 식별하기 위해 더 많은 옵션이 있다는 것을에 그것은뿐만 아니라, 모델의로 변경을 청취하기 위해 동일한 기능을 가지고 있습니다.

이상적으로 하나의 트리거가 n- 항목으로보기를 업데이트하는 것이 이상적입니다.

관련 문제