Ich verwende einen Signalr-Hub, um Ereignisse auf dem Server zu abonnieren. Was für ein Ereignis an einen Hub gesendet wird, das Hinzufügen des Elements zu einer Marionette CollectionView. Dies wird wiederum in eine Tabelle gerendert.
Da die Tabelle der Ereignisse im Wesentlichen ein Löschblatt ist, möchte ich, dass die Ereignisse in umgekehrter Reihenfolge ablaufen und vorzugsweise nur eine Anzahl von n Ereignissen enthalten.
Kann Backbone eine Sammlung in umgekehrter Reihenfolge "automatisch" rendern?
Um in umgekehrter Reihenfolge durch die Sammlung zu gehen, verwende ich normalerweise eine Konstruktion wie diese:
%Vor%Zu Ссылка
gibt es einen Thread zu diesem Thema Obwohl Backbone die Sammlung sortiert hält, sobald Sie einen Komparator definieren, wie @breischl darauf hingewiesen hat, rendert Marionette das CollectionView nicht automatisch neu, wenn sich die Reihenfolge ändert. Tatsächlich hört Marionette auf das Ereignis add
in der Sammlung und fügt ein neues ItemView hinzu.
Wenn Ihr CollectionView
Elemente immer in umgekehrter chronologischer Reihenfolge anzeigen soll und Sie möchten, dass neue Elemente vorangestellt statt angehängt hinzugefügt werden, überschreiben Sie appendHtml
Methode in Ihrem CollectionView
wie folgt:
Wenn Sie in der Lage sein möchten, an einem bestimmten Ort als @dira im Kommentar erwähnt, gibt es eine Lösung auf den Link oben auf github von sberberman, die ich hier aus Bequemlichkeit reproduzieren (Disclaimer: Ich habe nicht getestet der Code unten persönlich):
Ändern Sie appendHtml zu:
%Vor% Fügen Sie Folgendes hinzu, um jQuery
so zu erweitern, dass insertAt
function:
Normalerweise wird das Rendering in Ihrer Backbone.View
'Unterklasse' stattfinden. Du hast also etwas wie:
this.collection
ist vermutlich eine Backbone.Collection
Unterklasse, und Sie können einfach die underscore.js Methoden verwenden um es in beliebiger Reihenfolge zu bekommen:
usw.
Natürlich erhalten Sie ein einzelnes Element aus Ihrem Backend, und Sie möchten es an der richtigen Stelle einfügen, ohne das Ganze neu zu rendern! Gehen Sie in diesem Fall einfach in die alte Schule und fügen Sie Ihren Sortierschlüssel als rel
Attribut oder data
Attribut in die Elemente ein und verwenden Sie diesen in insertAfter
oder ähnlich mit jQuery in Ihrer renderNewItem
(oder ähnlich) Methode.
Backbone verwaltet Sammlungen automatisch in sortierter Reihenfolge. Wenn Sie eine nicht standardmäßige Sortierung verwenden möchten, definieren Sie eine comparator()
-Funktion für Ihre Sammlung, die stattdessen verwendet wird. Der Komparator kann ein oder zwei Argumente verwenden, weitere Informationen finden Sie in der Backbone-Dokumentation .
Sie können Ihre Sammlung dann in einer .each () - Schleife rendern, und sie wird in der richtigen Reihenfolge ausgegeben. Das Hinzufügen neuer Elemente zur Ansicht in sortierter Reihenfolge liegt jedoch bei Ihnen.
Nach dem, was Sie beschreiben, müssen Sie die Sammlung nicht in umgekehrter Reihenfolge neu rendern. Fügen Sie einfach ein Ereignis für add
in Ihrer Sammlung in dieser Ansicht hinzu und rufen Sie eine Funktion auf, die das gerade hinzugefügte Element rendert und der Tabelle voranstellt.
Da der BackBone die umgekehrte Iteration der Sammlung nicht unterstützt (und es nur Ressourcenverschwendung ist, die Sammlung umzukehren oder schlechter zu sortieren), ist der einfachste und schnellste Ansatz die for
-Schleife mit abnehmendem Index über Modelle in der Sammlung.
Es ist nicht so elegant, die Sammlung mit Underscore zu sortieren oder umzukehren, aber die Leistung ist viel besser. Versuchen Sie, hier verschiedene Loops zu vergleichen, nur um zu wissen, welche Kosten Sie für foreach anstelle von classic dafür bezahlen müssen.
Tags und Links backbone.js marionette