2014-02-17 4 views
9

Ich habe Probleme beim Konfigurieren des waitOn Teils einer Route, bei dem einer der Abonnementparameter durch den Wert eines Dokuments bestimmt wird von einem anderen Abonnement.Verwenden von Iron Router zum WartenEin Abonnement, das von Daten aus einem Dokument abhängt, das von einem anderen Abonnement stammt

Die Sammlungen im Spiel sind Kandidaten und Interviews. Ein Interview wird einen und nur einen Kandidaten haben. Hier einige Beispieldaten:

Die Route ist wie folgt konfiguriert.

this.route('conductInterview', { 
    path: '/interviews/:_id/conduct', //:_id is the interviewId 
    waitOn: function() { 
     return [ 
      Meteor.subscribe('allUsers'), 
      Meteor.subscribe('singleInterview', this.params._id), 
      // don't know the candidateId to lookup because it's stored 
      // in the interview doc 
      Meteor.subscribe('singleCandidate', ???), 
      Meteor.subscribe('questions'), 
      Meteor.subscribe('allUsers') 
     ]; 
    }, 
    data: function() { 
     var interview = Interviews.findOne(this.params._id); 
     return { 
      interview: interview, 
      candidate: Candidates.findOne(interview.candidateId); 
     }; 
    } 
}); 

Das Problem ist, dass ich auf das singleCandidate Abonnement im waitOn Verfahren keine candidateId müssen passieren, weil es in dem Interview doc gespeichert ist.

Ich habe an zwei mögliche Lösungen gedacht, aber ich mag sie nicht wirklich. Die erste ist, die Route zu etwas wie /interviews/:_id/:candidateId/conduct zu ändern. Die zweite besteht darin, die Daten zu denormalisieren und die Informationen des Kandidaten im Interviewdokument zu speichern.

Gibt es neben diesen beiden noch weitere Möglichkeiten?

Antwort

2

können Sie Ihre Funktion singleCandidate veröffentlichen ändern interviewId als Paramater statt candidateId zu nehmen und über this.params._id

+0

Duh ...so einfach. Ich konnte den Wald für die Bäume hier nicht sehen. Ich verwende die 'singleCandidate'-Veröffentlichung an anderer Stelle, aber ich werde eine 'interviewCandidate'-Veröffentlichung hinzufügen. Vielen Dank! –

5

Sie einige Ideen durch das Lesen bekommen kann this post auf reaktive verbindet. Weil Sie den Kandidaten als Teil der Route der Daten holen müssen, scheint es, wie der einfachste Weg, gerade ist sowohl das Interview und die Kandidaten zur gleichen Zeit zu veröffentlichen:

Meteor.publish('interviewAndCandidate', function(interviewId) { 
    check(interviewId, String); 

    var interviewCursor = Interviews.find(interviewId); 
    var candidateId = interviewCursor.fetch()[0].candidateId; 

    return [interviewCursor, Candidates.find(candidateId);]; 
}); 

jedoch kommen diese nicht reaktiv ist. Wenn ein anderer Kandidat dem Interview zugewiesen wird, wird der Client nicht aktualisiert. Ich vermute, dass das in diesem Fall kein Problem ist.

+0

Danke. Dies ist auch eine großartige Lösung. –

+0

Wie würde der Abonnent aussehen? –

+0

@JoeC 'Meteorsubscribe ('interviewAndCandidate')' –

2

ich ähnliches Problem hatte ich es geschafft, es in

http://docs.meteor.com/#/basic/Meteor-subscribe

Zum Beispiel abonnieren via Callback zu lösen haben Sie Benutzerdaten mit Stadt-IDs, und Sie müssen Stadt bekommen Objekte

waitOn: -> 
    router = @ 
    [ 
     Meteor.subscribe("currentUserData",() -> 
      user = Meteor.user() 
      return unless user 
      cityIds = user.cityIds 
      router.wait(Meteor.subscribe("cities", cityIds)) if cityIds   
     ) 
    ] 
+0

Cool! Das funktioniert gut für mich. –

+0

Großartig! Callbacks sind was ich brauchte. – torayeff

Verwandte Themen