Kann Rückgrat Rendern einer Sammlung in umgekehrter Reihenfolge?
Ich bin mit Signalr-hub, um Ereignisse zu abonnieren, die auf dem server. Was für ein Ereignis ausgelöst und eine Nabe, die erfolgreich das Element hinzufügen zu einer Marionette CollectionView. Dies wiederum ist gerendert in einer Tabelle.
Weil sich die Tabelle der Veranstaltungen wird grundsätzlich eine Unterlage, möchte ich die Ereignisse in umgekehrter Reihenfolge und vorzugsweise immer nur n-Anzahl der Ereignisse.
Können Rückgrat 'automatisch' re-Rendern, eine Sammlung in umgekehrter Reihenfolge?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gehen durch die Auflistung in umgekehrter Reihenfolge normalerweise verwende ich eine Konstruktion wie diese:
Gibt es einen thread zu diesem Thema im https://github.com/marionettejs/backbone.marionette/issues/78
Obwohl Rückgrat hält die Sammlung sortiert nach der Definition eines Komparators, wie @breischl wies darauf hin, Marionette nicht automatisch re-Rendern der CollectionView, wenn änderungen in der Reihenfolge. In der Tat, Marionette hört
add
Veranstaltung auf die Sammlung und hängt eine neue ItemView.Wenn Sie möchten, dass Ihre
CollectionView
immer der Anzeige von Elementen in umgekehrter chronologischer Reihenfolge, und Sie möchten, dass neue Elemente Hinzugefügt werden vorangestellt statt angehängt, dann überschreiben Sie dieappendHtml
Methode in IhrerCollectionView
wie folgt:Wenn Sie möchten, einfügen können, um an einem bestimmten Ort, wie @dira erwähnt im Kommentar, es gibt eine Lösung gepostet unter dem link oben auf github von sberryman, dass ich Schreibe hier für die Bequemlichkeit (disclaimer: habe ich noch nicht getestet der code unten persönlich):
Ändern appendHtml zu:
Und fügen Sie den folgenden zu erweitern
jQuery
zu bieteninsertAt
Funktion:In der Regel haben Sie die rendering-nehmen Sie Platz in Ihrem
Backbone.View
'Unterklasse'. Sie haben also so etwas wie:this.collection
ist vermutlich eineBackbone.Collection
Unterklasse, und so können Sie einfach underscore.js Methoden auf es, um es in der Reihenfolge, die Sie mögen:Etc.
Natürlich bekommen Sie ein einzelnes element aus dem backend, und Sie möchten fügen Sie es an der richtigen Stelle, ohne re-rendering der ganzen Sache! So in diesem Fall gehen Sie einfach old-school und legen Sie Ihre Sortierschlüssel als
rel
Attribut oderdata
- Attribut für die Elemente und verwenden Sie, uminsertAfter
oder ähnlich mit jQuery in IhrerenderNewItem
(oder ähnliche) Methode._.each( _.toArray(this.collection).reverse(), function(m) { ... } );
. Oder, wenn Sie wurden mit coffeescript Sie konnte nur schreiben Sie eine for-Schleife mit einen -1 step usw.Rückgrat sorgt automatisch für Sammlungen in sortierter Reihenfolge. Wenn Sie möchten, verwenden Sie eine nicht-Standard-sort definieren
comparator()
Funktion auf Ihre Sammlung und es wird stattdessen verwenden. Der Komparator kann entweder ein oder zwei Argumente, sehen Sie das Rückgrat Dokumentation für details.Können Sie dann machen Sie Ihre Sammlung in einem .each () - Schleife, und es wird kommen in der richtigen Reihenfolge. Neue Elemente hinzufügen, um die Ansicht in sortierter Reihenfolge ist bis zu Ihnen, obwohl.
Von dem, was Sie beschreiben, Sie müssen nicht re-Rendern der Sammlung in umgekehrter Reihenfolge. Fügen Sie einfach ein Ereignis für
add
auf Ihre Sammlung in dieser Ansicht und haben Sie eine Funktion aufrufen, die macht das Element nur Hinzugefügt und stellt es auf den Tisch.Können Sie rückgängig machen, Ihre Modelle in einer Sammlung wie so...
Wenn Sie lodash statt Unterstrich Sie können dies auch tun:
Als das Rückgrat der nicht-Unterstützung reverse iteration der Sammlung (und es ist nur Verschwendung von Ressourcen-in den Rückwärtsgang oder schlechter Sortieren der Sammlung) die einfachste und Schnellste Möglichkeit ist die Verwendung der
for
Schleife mit Abnehmender index über Modelle in der Sammlung.Es ist nicht so elegant wie die Sortierung oder die Umkehrung der Sammlung mit Unterstrich, aber die Performance ist viel besser. Versuchen Sie, vergleichen Sie verschiedene loops hier nur um zu wissen, welche Kosten Sie zu schreiben foreach anstelle der klassischen für.