2014-04-08 10 views
10

Ich habe an einer Anwendung mit einer Kommentarfunktion gearbeitet. Dies hat zur Folge, dass sowohl eine Sammlung, zu der die Kommentare gemacht werden, als auch die Kommentarsammlung selbst abonniert werden muss. Jetzt sieht es wie folgt aus:Mehrere Abonnements in Eisen-Router

<template name="bookView"> {{> book}} {{> comments}} </template>

this.route('book', { 
    path: '/book/:_id', 
    template: 'bookView', 
    waitOn: function() { return Meteor.subscribe('book');}, 
    action: function() { 
     if (this.ready()){ 
      this.render(); 
     } 
     else 
      this.render('loadingTemplate'); 
    }, 
    data: function() {return Books.findOne(this.params._id);} 
}); 

Aber jetzt würde Ich mag alle Kommentare auch zu diesem Buch gehört, laden. Oder sollte ich das Abonnement von Kommentaren in Template.comments.rendered behandeln?

Antwort

27

Ja, Sie haben zwei Möglichkeiten:

Logik im Controller. Sie können ein Array für mehrere Sammlungen abonnieren. Dies wäre die Art, wie Sie gehen, wenn Sie alle Kommentare sofort zeigen.

this.route('book', { 
     path: '/book/:_id', 
     template: 'bookView', 
     /* just subscribe to the book you really need, change your publications */ 
     waitOn: function() { 
     return [Meteor.subscribe('book', this.params._id), 
       Meteor.subscribe('comments', this.params._id)]; 
     }, 
     data: function() { 
     return { 
     book : Books.findOne(this.params._id), 
     comments: Comments.find(this.params._id)} 
     } 
    }); 

Wenn Sie Kommentare nicht anzeigen möchten, bis sie vom Benutzer angefordert werden. Sie können einem anderen Weg folgen:

Sie können die bookId auf buttonclick in eine Session-Variable festlegen. Dann können Sie eine Deps.autorun-Funktion definieren, die die Kommentarsammlung mit der bookId in Ihrer Session-Variablen abonniert. In Ihrer Kommentarvorlage müssen Sie lediglich die normale Sammelanfrage stellen. Wenn Sie weitere Hinweise auf diese Weise brauchen, lassen Sie es mich wissen.

+0

Ich habe das gleiche Problem und einige Probleme mit Daten werden analysiert und gerendert mit dem Meteor 0.8 Renderer, bevor es auf dem Client ist. Wie kann ich überprüfen, ob die Abonnements erfolgreich waren? – Tobi

+0

Die waitOn-Funktion wartet immer, bis die Daten empfangen werden. Dein Abo sollte also immer erfolgreich sein. – chaosbohne

+0

Wie kann ich auf Buchdaten von Template-Ereignissen zugreifen? – Sysrq147

5

Ihre waitOn-Funktion kann auf mehrere Subskriptionen warten, indem sie ein Array der Subskriptionshandles zurückgibt.