2012-04-13 7 views
2

Im Grunde versuche ich herauszufinden, wie man ein Modell am besten auswechselt und auf dieses Ereignis reagiert.Das Modell einer Ansicht austauschen?

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

view = new View({model:firstModel}) 

view.swapModel(newModel) 

Ist das alles, was ich tun muss, um das Modell einer Ansicht zu tauschen? Gibt es irgendwelche anderen Nebenwirkungen, die ich planen sollte? Was wäre der beste Weg, um auf diesen Tausch zu reagieren? Sollte ich ein Swap-Ereignis in swapModel auslösen?

Danke!

+0

Ich würde denken, dass Sie alle Ereignisse, die auf Ihrem Modell in Ihrer Ansicht gehört wurden, neu binden müssen, wenn Sie sie auch haben. – kinakuta

+1

Warum nicht einfach die alte Ansicht zerstören und eine neue erstellen? –

+0

@muistooshort vielleicht könnte ich, aber ein Teil der Ansichten Job ist es, auf die Erstellung des neuen Modells zu reagieren. Alles im Dom muss bleiben und es werden einige Änderungen am Dom vorgenommen, wenn das Modell wechselt. Es schien mir einfacher, das Modell zu tauschen, wenn es so funktionierte, wie ich es mir vorgestellt hatte. – fancy

Antwort

9

Modelle nicht in einer Ansicht austauschen. Sie werden auf alle Arten von Problemen im Zusammenhang mit DOM-Ereignissen, Modell-Ereignissen in der Ansicht usw. stoßen. Ich habe versucht, dies ein Dutzend Mal oder öfter zu tun, und in jedem einzelnen Fall habe ich meinen Code neu geschrieben Ich würde für jedes Modell eine neue View-Instanz erstellen. Der Code war sauberer, einfacher, einfacher zu verstehen und leichter zu pflegen und zu bearbeiten.

+0

Danke Derick, ich vertraue deiner Meinung zu all dem Zeug. Das wird mir wahrscheinlich viel Zeit sparen. :) – fancy

1

Ein sehr einfaches Beispiel für eine Möglichkeit, es zu tun. Warum versuchst du, Modelle zu tauschen?

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

Sie könnten eine Sammlung verwenden, die nur ein Modell zulässt. Auf diese Weise berühren Sie das Modell nicht und können das Rendering beliebig oft aufrufen. Etwas wie folgt aus:

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 

Sie könnten die Sammlung sperren Regeln ein bisschen weiter, aber ich denke, es ist ein gutes Beispiel dient, um Sie gehen.

Verwandte Themen