2013-03-15 2 views
3

지금 백본 모델에 바인딩 된 UI 요소가 많습니다. 이 모델에는 고객 정보가 들어 있으며 새 고객을 검색 한 다음 모델을 가져올 때마다 모델이 변경됩니다. 이전 고객 모델은이 새로운 모델로 덮어 씁니다. 대부분의 필드가 같은 이름이면 대부분의 요소는 더 많거나 적은 요소를 가질 수 있지만 전반적으로 거의 동일합니다.백본 : 모델을 병합하지만 데이터 바인딩 유지

새 모델 정보로 이전 모델 정보를 덮어 쓸 수 있지만 내 UI 요소에있는 모든 바인딩을 유지할 수있는 방법이 있습니까?

+4

'model1.set (model2.toJSON());'할 수 없습니까? –

답변

7

일반적으로 당신이 이있는 경우, 말하기, 가 {model: someModel}로 선언했다, 당신은 사용 someOtherModel 대신 만들고 싶어, 그것을 할 올바른 방법은 다음과 같습니다

someView.model = someOtherModel; 

당신 로 gumballhead 제안, 단순히 모델의 데이터를 변경 :

someView.model.set(someOtherModel.toJSON()); 

하지만 그게 ... 잘이 isn 가장 좋은 비유는 아니지만 Tim Lincecum 야구 카드를 지우고 매트 윌리엄스를 그리는 것과 비슷합니다. 단순히 Tim 카드를 매트 카드로 교체하는 것보다 낫습니다. 어느 쪽이든 당신은 매트를 말하는 야구 카드로 감기지만, 개념적으로 차이가있는 세계가 있습니다.

그러나 동일한 모델을 공유하는 많은 뷰 클래스가 있고 모든 뷰에 대해 편리한 모델을 한 번에 쉽게 변경하려는 경우 몇 가지 방법이 있습니다.

한 가지 방법은 어딘가 목록에있는 모든 뷰를 추적하는 것입니다, 그리고 당신과 같이, 그들 모두를 통해 모델의 반복 처리를 변경할 때마다 다음 :

var viewsThatUseBaseballCard = [view1, view2, view3, view4]; 

... 

_(viewsThatUseBaseballCard).each(function(view) { 
    view.model = someOtherModel; 
}); 

또 다른 방법은을 방지하는 것입니다 내장 된 this.model 대신 필요할 때마다 View 코드의 함수를 사용하여 모델을 가져옵니다. 대신 즉, :

var MyView = Backbone.View.extend({ 
    someMethod: function() { 
     this.model.doSomething(); 
    } 
}); 

var MyView = Backbone.View.extend({ 
    someMethod: function() { 
     getCurrentModel().doSomething(); 
    } 
}); 

(다음 물론 당신은 getCurrentModel 반환 someOtherModel하기 위해 뭔가를해야하지만 적어도 다음은 코드에서 한 곳으로 집중 될 것이다).

이 위의 다른 변화가 있지만 일반적인 생각은 당신도 할 수 있다는 것입니다 :

A)는 어떤 종류를 사용) 귀하의 의견에 this.model를 사용하고 단지 필요

B로 새로운 this.model을 설정 getModel()의 뷰를 호출하고 해당 함수가 새 모델을 적절하게 반환하도록 수정하십시오.

(또는 C로도) 동일한 모델을 유지하고 즉 변경 할 수 있습니다. 야구 카드 옵션을 지우거나 다시 쓰십시오).

나는 개인적으로 B쪽으로 기대고 있지만 궁극적으로 상황에 따라 다릅니다.

* EDIT *

그냥 내가 놓친 몇 가지 다른 옵션이 있다는 것을 깨달았다

D)가 같은 모델 (하지에 따라 모든되지 않도록 귀하의 의견을 다시 디자인 이것은 당신을위한 옵션이지만 반드시 언급 할 가치가 있습니다)

E) "참조 모델"을 사용하십시오; 대신 즉, :, 귀하의 의견 안에,

new SomeView({model: currentPlayerReference}); 

다음을 수행하십시오 :

new SomeView({model: TimLincecum}); 

this.model.getCurrentPlayer(); 

이 내 옵션 B와 유사하다)하지만,이 currentPlayerReference 모델에서 변경되지 않는 데이터를 저장할 수 있다는 이점이 있습니다.

관련 문제