2 Stimmen

Backbone Marionette Composite view onRender wird zweimal ausgeführt

Ich habe eine Backbone-Marionetten-Composite-Ansicht wie folgt

VideosView = Backbone.Marionette.CompositeView.extend({
        template : videosTpl,
        id : "video",
        itemView : VideoView,

        initialize : function() {
                 //fetching the collection 
            var myVideos = new VideoCollection();
            myVideos.fetch();
            this.collection = myVideos;
        },
        appendHtml : function(collectionView, itemView) {
            //appending each videos to the video list
            console.log("appendHtml");
            collectionView.$("ul").append(itemView.el);

        },
        onRender: function(){
            console.log("onRender");

        },
        onShow: function(){
            console.log("onShow");

        }
    });

Die Ausgabe auf der Konsole lautet

  • onRender
  • onShow
  • 4 appendHtml
  • onRender

Der erwartete Codefluss laut Backbone-Marionette war

  • 4 appendHtml
  • onRender
  • onShow

Wie konnte das passieren?

2voto

Ingro Punkte 2841

Das kann daran liegen, dass Sie die Daten in der Initialisierungsfunktion abrufen. Ein Abruf verursacht ein collection.reset() und somit wird Ihre Composite-Ansicht neu gerendert, wie in der Dokumentation angegeben:

"Das Modell und die Sammlung für die zusammengesetzte Ansicht werden unter den folgenden Bedingungen selbst neu gerendert:

  • Wenn das "Reset"-Ereignis der Sammlung ausgelöst wird, wird nur die Sammlung innerhalb des Composites neu gerendert und nicht die Wrapper-Vorlage..."

In der Tat, wenn Sie zuweisen this.collection den Wert von myVideos Sie können nicht garantieren, dass fetch() aufgrund der asynchronen Natur von Javascript seine Arbeit getan hat.

Versuchen Sie etwas Ähnliches, wenn Sie VideosView aufrufen:

var myVideos = new VideoCollection();

myVideos.fetch({success:function(){

    var View = new VideosView({collection:myVideos});
}});

Natürlich können Sie jetzt Ihre Initialisierungsfunktion ausblenden.

0voto

Derick Bailey Punkte 70483

Welche Version von Marionette verwenden Sie? Es gab einen Fehler, der dies in v1.0.0-beta1 verursachte: https://github.com/marionettejs/backbone.marionette/issues/287

es wurde in v1.0.0-beta2 behoben (die letzte Version ist v1.0.0-beta3, als ich dies schrieb)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X