2016-04-06 3 views
0

Ich habe eine Ansicht wie folgt aufgebaut Modell:Wie funktioniert Backbone View-Rendering?

var PlayerView = Backbone.View.extend({ 
    el: "div.player", 
    template: _.template($("#playerTemplate").html()), 

    render: function() { 
     this.$el.append(this.template(this.model.toJSON())); 
     return this; 
    } 
}); 

und die Hauptansicht wird wie folgt aufgebaut:

var AppView = Backbone.View.extend({ 
    el: "#players", 

    render: function() { 
     var pView = new PlayerView({model: playerModel}); 
     this.$el.append(pView.render().$el); 
    } 
}); 

Wenn Sie die render von AppView bemerken, ich die PlayerView erste bin Rendering und fügt dann $el an AppView 's $ el an. Ich habe erwartet, hier eine Fehlersituation, da es PlayerView 2 mal zur Hauptansicht angezeigt werden würde, wie folgt:

  • Zuerst wird in den pView.render() wo ich zufrieden stellte in pView und
  • Zweitens in der gleichen Zeile, wo ich Hängen Sie pViews $el an die Hauptansicht an.

Aber es fügt nur die pView nur einmal an. Wie funktioniert das?

Ich bin mir nicht sicher, dass ich meine Frage klar erklärt habe; Ich kann bei Bedarf mehr Kontext hinzufügen.

+1

Das Anhängen des 'PlayerView' -Elements an' AppView' bewirkt nicht, dass der Inhalt sich dupliziert. Sie hängen den Inhalt an 'PlayerView' an und hängen dann das' PlayerView'-Element (welches das Containerelement + den angehängten Inhalt ist) an 'AppView' an. Auch die Backbone-Renderfunktionalität wird vollständig von Ihnen definiert, so dass sie in keiner Weise wirklich "funktioniert", sondern nur in der Weise, wie Sie sie definieren. Das 'el' Zeug ist immer noch Javascript/Jquery. –

+0

Danke für die Erklärung. Ich bin mir nicht sicher, ob ich folgendem Beispiel folgen soll: Mein html enthält bereits 'div.player'. Wenn ich den Inhalt zum ersten Mal an' PlayerView' angehängt habe, sollte er auf dem Bildschirm erscheinen, oder? Danach, wenn ich 'PlayerView's' el' an' AppView' anschließe, sollte das ganze 'PlayerView' wieder auf dem Bildschirm gezeichnet werden. Bitte korrigieren Sie mich, wenn ich falsch liege. – akshayKhot

+1

Ich verstehe Ihre Verwirrung. Wenn ein Element an ein anderes angehängt wird, wird es von seinem ursprünglichen Punkt entfernt. Beispiel. https://jsfiddle.net/guanzo/xtenekte/2/ –

Antwort

2

Unter der Annahme, div.player in DOM existiert, wie Sie in den Kommentaren erwähnt,

Wenn Sie pView.render() tun, fügt er die Vorlage in seinem Inneren.

Dann, wenn Sie pView ‚s Element (div.player) zu AppView des Elements (#players) anhängen, ganze div.player in #players bewegt.

Ihr Code funktioniert so, wie es funktionieren sollte.

Wenn Sie mehrere Player erstellen möchten, sollten Sie die Option el nicht in der Playeransicht verwenden. Stattdessen sollten Sie das vom Backbone erstellte Element dekorieren und mehrere Instanzen der Playeransicht erstellen.

+0

Danke, jetzt verstehe ich was passiert hinter den Kulissen. – akshayKhot