2013-03-01 11 views
5

Ich habe ein Problem: Mein CollectionView rendert meine ItemViews nicht. Ich übergebe eine Sammlung aus einem Layout an eine Sammlungsansicht. Ich Abrufen der Sammlung in der CollectionView:Marionetten-Sammlung Ansicht, Sammlung holen löst keine Ereignisse aus

Im Layout:

// Create a a collection for the view 
    this.articles = new Articles(null, { 
     organizationId : this.model.organizationId, 
     projectId : this.model.id 
    }); 

    var articlesView = new ArticleCollectionView({ collection : this.articles}); 
    this.articlesRegion.show(articlesView); 

Im Collection:

define([ 
    'marionette', 
    'templates', 
    'i18n!nls/projectDashboard', 
    'views/projectDashboard/ArticleItem' 
], function (Marionette, templates, msg, ArticleItemView) { 

    return Marionette.CollectionView.extend({ 

     initialize : function() { 
      this.listenTo(this.collection, "reset", this.render); 
      this.collection.fetch(); 
     }, 

     itemView : ArticleItemView 

    }); 

}); 

Im ItemView:

define([ 
    'marionette', 
    'templates', 
    'models/Article' 
], 
function (Marionette, templates, Article) { 

    return Marionette.ItemView.extend({ 

     initialize : function() { 
      console.log('itemviewrender'); 
     }, 

     template : templates.projectDashboard.articleItem 
    }); 

}); 

Das Setup im Allgemeinen funktioniert. Ich habe einen Weg gefunden, das funktioniert zu bekommen: Holen Sie die Sammlung in das Layout und zeigen Sie die CollectionView in der Region auf den Erfolg Callback.

Das Hinzufügen von Listenern in CollectionView für die Auflistung schlägt jedoch fehl. Kein Ereignis wird wie

für zwingend notwendig und deklarative Zuhörer gefeuert
this.collection.on('reset', this.render, this); 

oder

collectionEvents : { 
    'reset' : 'render' 
} 

Ich möchte einfach die Sammlung Blick auf rerender mit ihm Artikel Ansichten ist, wenn die Sammlung geholt wird. Ich bin mir sicher, dass ich etwas verpasst habe. Jede Hilfe wird geschätzt!

UPDATE: Ich habe etwas Interessantes gefunden: Ich sagte bereits, wenn ich die Sammlung im Layout abholen und die CollectionView auf dem Erfolg Callback erstellen, funktioniert es. Das Interessante ist: Die Zuhörer funktionieren auch, wenn ich die geholte Sammlung durchlasse. Ich trigne sie durch erneutes Rufen this.collection.fetch() in initialize. Dann funktioniert das Rendern. Es muss etwas um den Sammelpass vom Layout her sein.

+0

wo sind die Ereignisse verbindlich? sollte es nicht in der Initialisierungsmethode 'CollectionView' sein? Versuchen Sie auch 'listenTo' anstelle von' on' zu verwenden – neebz

+0

sie sind in der collectionView, ich sollte eins in der CollectionView zum besseren Verständnis hinzufügen, ich denke, doenst arbeiten mit listenTo entweder – pfried

+0

das ist interessant. Laut der Dokumentation scheint es, dass Sie Ereignisse nicht manuell binden müssen, da Marionnette dies automatisch für Sie erledigt, siehe: https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.collectionview.md# Sammlungsansicht-Rendern In diesem Fall scheint es ein seltsames Problem, – neebz

Antwort

2

Sie mögen die Collection verwenden

Hier ist ein Beispiel aus den Puppen Docs

Marionette.CollectionView.extend({ 
    collectionEvents: { 
    "sync": "render" 
    } 
}); 

Im Beispiel wird das Rendern ausgelöst werden, wenn die Sammlung von Back-End voll bestückt wurde

modelEvents and collectionEvents

Verwandte Themen