2012-08-30 7 views
5

Ich habe eine Marionette CompositeView mit einem Suchfeld und die Sammlung von Ergebnisdaten.Nach Render-Ereignis auf CompositeView mit Backbone.Marionette

Ich möchte eine Funktion aufzurufen, wenn:

  • das Suchfeld gerendert wird.
  • Die Sammlung wird noch nicht gerendert.
  • Diese Funktion sollte nicht aufgerufen werden, wenn die Sammlung gerendert wird.

ich es auf diese Weise tat (aber „afterRender“ -Funktion zweimal bekommen genannt)

// VIEW 
App.MyComposite.View = Backbone.Marionette.CompositeView.extend({ 
    // TEMPLATE 
    template: Handlebars.compile(templates.find('#composite-template').html()), 
    // ITEM VIEW 
    itemView: App.Item.View, 
    // ITEM VIEW CONTAINER 
    itemViewContainer: '#collection-block', 

    //INITIALIZE 
    initialize: function() {   
     this.bindTo(this,'render',this.afterRender); 
    }, 

    afterRender: function() { 
     //THIS IS EXECUTED TWICE... 
    } 

}); 

Wie kann ich das tun?

========================= EDIT ====================== ==============

Ich löste es auf diese Weise, wenn Sie eine Beobachtung haben, lass es mich wissen.

// VIEW 
App.MyComposite.View = Backbone.Marionette.CompositeView.extend({ 

    //INITIALIZE 
    initialize: function() {   
     //this.bindTo(this,'render',this.afterRender); 
     this.firstRender = true; 
    }, 

    onRender: function() { 
     if (firstRender) { 
      //DO STUFF HERE.............. 
      this.firstRender = false;   

     } 
    } 

}); 
+0

Bitte geben Sie einige weitere Details über Ihre Ereignisbindungen und wenn reneder – schacki

+0

genannt wird Es ist in der Funktion initialize: „this.bindTo (this, 'render', this.afterRender) ". Ich bin mir nicht sicher, ob das richtig ist, aber was ich tun will, ist die Funktion "afterRender" aufzurufen, sobald die Ansicht gerendert wurde. –

Antwort

11

Marionette stellt eine onRender in seinen Ansichten gebaut Methode, um alle, so dass Sie von dem this.bindTo(this, 'render', this.afterRender) Anruf loswerden können:


// VIEW 
App.MyComposite.View = Backbone.Marionette.CompositeView.extend({ 
    // TEMPLATE 
    template: Handlebars.compile(templates.find('#composite-template').html()), 
    // ITEM VIEW 
    itemView: App.Item.View, 
    // ITEM VIEW CONTAINER 
    itemViewContainer: '#collection-block', 

    //INITIALIZE 
    initialize: function() {   
     // this.bindTo(this,'render',this.afterRender); // <-- not needed 
    }, 

    onRender: function() { 
     // do stuff after it renders, here 
    } 

}); 

Aber es ist nicht die Arbeit zu bekommen tun, wenn die Sammlung Nicht gerendert, müssen Sie der onRender-Methode Logik hinzufügen, die überprüft, ob die Sammlung gerendert wurde oder nicht.

Dies hängt weitgehend davon ab, was Sie mit dem Rendern tun möchten, wenn keine Objekte aus der Sammlung gerendert werden.

Zum Beispiel ... Wenn Sie die Meldung "Keine Objekte gefunden" rendern möchten, können Sie die integrierte Konfiguration emptyView für die zusammengesetzte Ansicht verwenden.


NoItemsFoundView = ItemView.extend({ 
    // ... 
}); 

CompositeView.extend({ 

    emptyView: NoItemsFoundView 

}); 

Aber wenn Sie irgendeinen speziellen Code, der ausgeführt werden muss, und bestimmte Dinge tun, die von dieser Option nicht abgedeckt ist, dann werden Sie in einem gewissen Logik Ihrer eigenen setzen müssen.


CompositeView.extend({ 

    onRender: function(){ 
    if (this.collection && this.collection.length === 0) { 
     // do stuff here because the collection was not rendered 
    } 
    } 

}); 
+0

Danke für deine Antwort. Vielleicht das: "this.collection.length> 0" sollte geändert werden durch "this.collection.length == 0" –

+0

d'oh! Ja tu das :) –

Verwandte Themen