2013-03-01 22 views
18
nicht
// Snippet from Template 
<div class="post-container"> 
    {{#each elements}} 
    {{> post-element this}} 
    {{/each}} 
</div> 

// Snippet from Client 
Meteor.subscribe('thePosts'); 

// Snippet from Server 
Meteor.publish('thePosts', function(){ 
    return Posts.find({}, {sort:{createdAt:-1}, reactive:true}); 
}); 

Als ich tun ...Meteor Sortierung der Sammlung Abonnieren

Posts.insert({body:postBody, createdAt: new Date()}); 

Die Post Dokument wird hinzugefügt und erscheint am Ende meiner Liste aktualisieren, wie angegeben absteigender Reihenfolge gegen in meiner Veröffentlichungsfunktion. Irgendeine Idee darüber, was ich falsch mache?

Danke!

Antwort

46

Die veröffentlichen Funktion bestimmt, welche Datensätze sollten auf die Mini-Mongo Datenbank von jedem synchronisiert werden abonnierende Kunden. Das Sortieren der Daten in der Veröffentlichungsfunktion hat also keine Auswirkungen auf den Client, da die clientseitige Datenbank sie wahrscheinlich auf andere Weise speichert.

Natürlich möchten Sie vielleicht in einem Verlag find sortieren, um die Anzahl der Datensätze auf die neuesten N zu begrenzen - aber auch dies ist nur eine Möglichkeit zu entscheiden, welche Datensätze synchronisiert werden und nicht wie sie sein sollen gespeichert/verwendet vom Kunden.

Sobald die Datensätze mit dem Client synchronisiert wurden, hängt es vom Vorlagencode ab, wie die Ergebnisse angezeigt werden sollen. Zum Beispiel:

Template.myTemplate.elements = function() { 
    return Posts.find({}, {sort: {createdAt:-1}}); 
} 

Siehe auch die „sortierte veröffentlichen“ in meinem Beitrag auf common mistakes.

+1

David, das ist wirklich die Frage, die ich beantwortet haben wollte! Ausgezeichnete Antwort, vielen Dank! – erichrusch

+0

+1 für schöne Erklärung –

+0

Vielen Dank! Du hast mir gerade eine Menge Zeit gespart :-) – ant45de

4

Sie haben Ihren Template-Hilfscode nicht veröffentlicht.

Wenn Sie return Posts.find() von der Hilfsfunktion zu tun, sollte die Abfrage enthält auch die Art Argumente, wie wie folgt:

Template.myTemplate.elements = function(){ 
    Meteor.subscribe('thePosts'); 
    return Posts.find({}, {sort:{createdAt:-1}, reactive:true}); 
} 
+0

Template-Funktionen werden in einem reaktiven Kontext ausgeführt, so dass das 'reactive: true' nicht benötigt wird. –

+0

Ja, ich dachte, dass es zu wahr ist, ich habe nur mit verschiedenen Lösungen rumgespielt. – erichrusch

+0

Sohel, du warst richtig die Hilfsfunktion sollte Filterung tun. Die Veröffentlichung leitet das Synchronisierungsdokument an den Browser weiter. Ich verstehe jetzt, was hier vor sich geht, Jungs! – erichrusch

Verwandte Themen