2016-12-02 2 views
1

Ich bin mir nicht sicher, ob dies eine Beschränkung auf React und Meteors Verbindung ist, da die Dokumentation vorschlägt, dass es ohne den zusätzlichen Parameter möglich sein sollte.React and Meteor Subscription

Wenn ich eine Meteor-Subskription in react aufruft, wenn ich den Parameter in der Abfrage nicht explizit festlege, gibt sie alle Daten zurück und ignoriert die angegebenen Daten in der Publish-Funktion.

Meteor.publish("supplier", function() { 
    if(this.userId) { 

     var user = Meteor.users.findOne(this.userId, { fields : { active : 1 }}); 
     if(user.active != this.userId || user.active != undefined){ 

     // This only returns 1 singular supplier - is correct 
     var supplier = Supplier.find({ _id : user.active, users : this.userId }); 
     return supplier; 

     } else { 
     return this.ready(); 
     } 
    } else { 
     return this.ready(); 
    } 
}); 

Jetzt nenne ich das Abonnement in reagieren als so

getMeteorData: function() { 

    var data = {} 

    handle = Meteor.subscribe("supplier"); 

    if(handle.ready()) { 
     data.supplier = Supplier.findOne(); // Returns Wrong supplier 
     //data.supplier = Supplier.findOne({_id: session.get("active")}) // Returns correct supplier 
     data.supplierReady = true 
    } 

    return data; 

    }, 

Dies liefert den ersten Anbieter in der Sammlung des in der veröffentlichen Funktion auf dem Server nicht angemeldet! Wenn ich jedoch { _id : user.active} übergeben, funktioniert es!

Jetzt war es mein Verständnis, dass durch die Logik auf dem Server innerhalb der publish Funktion, die ich einfach Supplier.findOne() verwenden könnte, aber das ist nicht der Fall, und ich verstehe nicht warum. Ist das eine Einschränkung von React/Meteor oder setze ich das falsch um?

Antwort

2

Dies ist kein reaktionsspezifisches Problem, es ist ein Ergebnis der Art, wie findOne funktioniert. Wenn Sie ein oder mehrere Dokumente auf Ihrer Client-Seite Supplier Sammlung haben, wird Supplier.findOne() nur den ersten verfügbaren Datensatz ohne Verweis auf die Dokumente abrufen, die Sie gerade von Ihrem Abonnement abgerufen haben.

Dies bedeutet, entweder (a) Sie haben mehr als einen Anbieter auf der Client-Seite aufgrund anderer bereits bestehender Abonnements verfügbar, oder (b) Sie mehr als einen Lieferanten aus dem handle Abonnement zurückgeben.

Überprüfen Sie den Status der clientseitigen Sammlung vor dem handle Abonnement. Wenn es 1 oder mehr Dokumente gibt und dies der beabsichtigte Status Ihrer Anwendung ist, ändern Sie die Clientseite findOne, um {_id: user.active} wie zuvor hinzuzufügen.

+0

Hallo Jeremy. Danke für die informative Antwort. Ich verstehe den Prinzipal jetzt und das Problem ist, dass mehrere Abonnements der Lieferantensammlung existieren müssen (da Sie zwischen Lieferanten wechseln können). Ich bin interessiert, wenn Sie erklären oder erklären könnten, was Sie mit 'Überprüfen Sie den Zustand der Client-Seite Sammlung 'meinen. Sie meinen nur eine Anzahl oder Abfrage, um die Client-Sammlung zu überprüfen? – Allreadyhome

+1

Ja, ich meinte, Sie könnten sich die Client-Sammlung kurz vor der Ausführung des Abonnements ansehen. Sie könnten console.log einen find(). Fetch() oder einen find(). Count() für einen schnellen Überblick anzeigen, oder Sie könnten eines der verfügbaren Tools verwenden, um die Sammlungen genauer zu untersuchen. Die eine, die ich wirklich mag und benutze, ist https://github.com/bakery/meteor-devtools - einige Leute benutzen gerne Mongol. Sie machen es einfach einfacher, da Sie keine Befehle in Ihrem Code oder der Konsole eingeben müssen. –

+0

Schöne Empfehlung über die Dev-Tools. Vielen Dank! – Allreadyhome

Verwandte Themen