2012-04-13 4 views
2

기본적으로 나는 모델을 교환하고 그 이벤트에 반응하는 가장 좋은 방법을 찾아 내려고 노력하고 있습니다.보기 모델을 교체 하시겠습니까?

class View extends Backbone.View 
    initialize:()-> 
     #do stuff 
    swapModel: (newModel)-> 
     @model = newModel 

view = new View({model:firstModel}) 

view.swapModel(newModel) 

보기 모델을 교체하려면이 작업 만 수행해야합니까? 내가 계획해야하는 다른 부작용이 있습니까? 이 스왑에 응답하는 가장 좋은 방법은 무엇입니까? swapModel에서 스왑 이벤트를 트리거해야합니까?

감사합니다.

+0

당신이보기에 모델에서 들었던 모든 이벤트를 리 바인드해야한다고 생각합니다. – kinakuta

+1

왜 이전보기를 파괴하고 새보기를 만드는 것이 좋을까요? –

+0

@muistooshort 아마 내가 할 수 있겠지만,보기 작업의 일부는 새로운 모델의 생성에 반응하는 것입니다. 돔에있는 모든 것은 머물러 있어야하며 모델이 바뀔 때 돔에 약간의 변화가 있습니다. 내가 생각한 방식대로 작동한다면 모델을 교체하는 것이 더 쉬워 보였다. – fancy

답변

9

보기에서 모델을 바꾸지 마십시오. DOM 이벤트와 관련된 모든 종류의 문제, 뷰의 모델 이벤트 등을 실행할 것입니다.이 작업을 12 번 이상 시도하고 모든 경우에 코드를 다시 작성했습니다. 나는 각 모델에 대한 새로운 뷰 인스턴스를 생성 할 것이다. 코드는보다 깨끗하고 간단하며 이해하기 쉽고 유지 보수 및 작업이 더 쉽습니다.

+0

감사합니다 Derick,이 모든 것들에 대한 당신의 의견을 신뢰합니다. 이것은 아마도 많은 시간을 절약 할 것입니다. :) – fancy

1

한 가지 방법의 아주 간단한 예입니다. 왜 모델을 바꾸려고합니까?

MyView = Backbone.View.extend({ 
    initialize: function() { 

    this.myTrigger = {}; 
    _.extend(this.myTrigger, Backbone.Events); 

    this.myTrigger.on("modelChange", function(msg) { 
     alert("Triggered " + msg); 
    },this); 

    }, 
    swapModel: function(model) { 
     // do something with model 
     // then trigger listeners 
     this.myTrigger.trigger("modelChange", "a model change event"); 
    } 
}); 

var myview = new MyView() 
myview.swapModel() 
1

하나의 모델 만 허용하는 모음을 사용할 수 있습니다. 이렇게하면 모델을 만지지 않고 원하는만큼 렌더링을 호출 할 수 있습니다. 이런 식으로 뭔가 :

var SpecialCollection = Backbone.Collection.extend({ 
    swap: function (model) { 
     //remove all models 
     this.reset(); 
     //add one model 
     this.add(model); 
    } 
}); 

var MyView = Backbone.View.extend({ 
    initialize: function(){ 
     this.listenTo(this.collection, 'add', this.render); 
    }, 
    render: function() { 
     this.model = this.collection.first() 
     //do your normal rendering here 
    } 
}); 

var c = new SpecialCollection(); 
var v = new MyView({collection: c}); 
c.swap({name: 'Sam'}); 
//view should render 
c.swap({name: 'Dave'}); 
//view should render 

당신은 컬렉션을 잠글 수는 조금 더 규칙하지만 난 당신이 가고 얻을 수있는 좋은 예로서 역할을 생각합니다.

관련 문제