2016-06-27 15 views
0

Ich habe den folgenden Code:Meteor Publish & Subscribe Nicht welche Ergebnisse Selektor

import { Meteor } from 'meteor/meteor'; 
import { Items } from './collection'; 

    if (Meteor.isServer) { 
     Meteor.publish('items', function(options, owner) { 

     let selector = { 
      $and: [{ ownerId: owner}] 
     } 

     return Items.find(selector, options); 

     }); 
    } 

Und auf der Client-Seite habe ich:

this.subscribe('items',() => [{ 
     limit: this.getReactively('querylimit'), 
     sort: {dateTime: -1} 
    }, 
    this.getReactively('ownerId') 
    ]); 

Die oben keine Ergebnisse zurückgibt. Wenn ich jedoch die Return-Anweisung in den folgenden ändern, funktioniert es!

return Items.find({ ownerId: '7QcWm55wGw69hpuy2' }, options); //works !!! 

Ich bin nicht sehr vertraut mit Mongo/Meteor Abfrage Selektoren. Das Übergeben der Abfrage als eine Variable an Items.find() scheint etwas zu vermasseln. Kann mir bitte jemand helfen, das herauszufinden?

Dank

Antwort

0

Sie versuchen, eine Funktion wie die Wähler passieren, die nicht funktionieren. Funktionen können nicht serialisiert und vom Client an den Server gesendet werden. Stattdessen müssen Sie die options und die owner separat auswerten. Hier ein Beispiel:

var owner = this.getReactively('ownerId'); 
var options = { 
    limit: this.getReactively('querylimit'), 
    sort: {dateTime: -1} 
}; 

this.subscribe('items', options, owner); 

Beachten Sie, dass die veröffentlichten Dokumente nicht arrive in sorted order, so, wenn Sie ein limit verwenden, die sort hier nicht helfen.

Beachten Sie auch, dass wenn Sie das Abonnement nach der Änderung des Besitzers oder der Abfragegrenze erneut ausführen müssen, müssen Sie innerhalb einer autorun abonnieren.

Hier ist ein Start auf eine verbesserte Umsetzung:

Meteor.publish('items', function(options, owner) { 
    // DANGER! Actually check this against something safe! 
    check(options, Object); 

    // DANGER! Should any user subscribe for any owner's items? 
    check(owner, Match.Maybe(String)); 

    // Publish the current user's items by default. 
    if (!owner) { 
    owner = this.userId; 
    } 

    return Items.find({ ownerId: owner }, options); 
}); 
+0

Dank. Ich bin gerade mobil und kann nicht nachsehen. Ich frage mich jedoch, warum ich console.log auf Serverseite verwenden konnte, um die Argumente zu drucken. console.log (selector) gibt die ownerId-Zeichenfolge aus, die ich in die zweite return-Anweisung eingefügt habe. – Neo

+0

Ich habe die ursprüngliche Frage falsch gelesen und ein paar Änderungen vorgenommen. –

+0

Nochmals vielen Dank, aber das scheint das Problem nicht zu lösen. – Neo