2013-03-28 8 views
9

Ich bin ziemlich neu auf Meteor und Mongo und auch wenn ich es nicht will, brauche ich ein paar Beziehungen.Meteor Sammlung nicht aktualisieren Abonnement auf Client

Ich habe eine Sammlung namens Feeds und eine weitere namens UserFeeds, wo ich eine feedid und eine Benutzer-ID haben, und ich veröffentliche der Benutzer auf dem Server wie folgt Feeds:

Meteor.publish('feeds', function(){ 
    return Feeds.find({_id:{$in:_.pluck(UserFeeds.find({user:this.userId}).fetch(),'feedid')}}); 
}); 

Ich finde den Benutzer auf UserFeeds, holen it (gibt ein Array zurück) und pflückt es, um nur das Feedid-Feld zu haben, und dann diese Feeds in der Feeds-Auflistung zu finden.

Und auf dem Client wie folgt anmelden:

Deps.autorun(function(){ 
    Meteor.subscribe("feeds"); 
}); 

Das Problem ist, dass, wenn ich einen neuen Feed und einen neuen userfeed fügen der Kunde die Änderung nicht erhält, aber wenn ich die Seite aktualisieren die neue Feed erscheint.

Irgendeine Idee von dem, was ich hier vermisse?

Danke.

+0

Was war die Lösung für dieses Problem vor so einer Situation ---- http://stackoverflow.com/questions/42652958/how-to-update-data-getting-from-meteor-subscription-when-value- aktualisiert-irgendwo –

Antwort

1

try this ...

Meteor.autosubscribe(function(){ 
    Meteor.subscribe("feeds"); 
}); 

und in der Vorlage JS ...

Template.templateName.feeds = function() 
    return Feeds.find() # or any specific call 
}; 

im HTML ...

{{#each feeds}} 
    do some stuff 
{{else}} 
    no feed 
{{/each}} 
+0

Hallo, ist das Problem nicht auf dem Client, sondern auf dem Server, macht der Kunde der Feeds ganz gut, das Problem ist, wenn ein neuer Feed erstellt wird und den Benutzer im Zusammenhang es nicht um die Änderung des nicht drücken Klient. – Beldar

11

Ich denke, Ihr Problem ist, dass .fetch(), die Sie hier verwenden ...

UserFeeds.find({user:this.userId}).fetch() 

... entfernt die Reaktivität.

.fetch() gibt ein Array anstelle eines Cursors zurück, und dieses Array ist nicht reaktiv.

http://docs.meteor.com/#fetch

15

Ich habe in diesem Lauf, auch. Es stellt sich heraus, dass Veröffentlichungsfunktionen auf dem Server nicht reaktiv ausgeführt werden: Wenn sie einen Auflistungscursor zurückgeben (wie es die meisten Veröffentlichungsfunktionen tun), wird die Veröffentlichungsfunktion einmal ausgeführt und Meteor speichert den Cursor und senden Sie Updates nur dann, wenn sich der Inhalt des Cursors ändert. Das wichtige Ding hier ist, dass Meteor nicht die Veröffentlichungsfunktion noch die Collection.find(query), wenn query Änderungen erneut ausführen wird. Wenn Sie möchten, dass die Veröffentlichungsfunktion erneut ausgeführt wird, muss ich die Veröffentlichungsfunktion so einrichten, dass sie ein Argument erhält. Auf diese Weise kann der Client, dessen Sammlungen reaktiv aktualisieren, re-subskribieren. Der Code würde in etwa so aussehen:

// client 
Meteor.subscribe('user_feeds'); 

Deps.autorun(function(){ 
    var allFeeds = UserFeeds.find({user: Meteor.userId()}).fetch(); 
    var feedIds = _.pluck(allFeeds,'feedid'); 
    Meteor.subscribe('feeds',feedids); 
}); 

// server 
Meteor.publish('feeds',function(feedids) { 
    return Feeds.find({_id: {$in: feedids}}); 
}); 

Ich glaube, das Meteorite Paket publish-with-relations ist so konzipiert, um dieses Problem zu lösen, obwohl ich es nicht benutzt haben.

EDIT: Ich glaube, die Veröffentlichungsfunktion wird erneut ausführen, wenn die userId ändert, was bedeutet, dass Sie eine serverseitige Überprüfung haben können, um sicherzustellen, dass der Benutzer vor der Veröffentlichung sensibler Daten angemeldet ist.

+0

Ich habe das gleiche Problem, wo ich Alanning Rolle Paket für Gruppen/Rollen benutzen und versuche, auf der Benutzer-Rollen (die Änderung) zu filtern publish die Basis. Ich melde in der Eisen-Router 'waitOn', so dass ich denke, ich muss, dass irgendwo ausziehen. Würden Sie den Subscribe im 'create' oder vielleicht im' gerenderten' verschieben? – CodeChimp

+0

Was, wenn es drei Sammlungen: Benutzer, Objekte und Berechtigungen. Elemente werden entsprechend Berechtigungen an Benutzer veröffentlicht. Berechtigungen können sich ändern und wir möchten, dass diese Änderung sofort berücksichtigt wird. Wir können einfach nicht Benutzer-ID oder die Erlaubnis ID oder effektive Berechtigungen von Client-Seite von „Meteor.publish“ Funktion aus Sicherheitsgründen Grunde, richtig akzeptieren? – gumkins

0

Sie können das reactive-publish Paket (Ich bin einer der Autoren). Sie können Veröffentlichungsendpunkte erstellen, die vom Ergebnis einer anderen Abfrage abhängen. Fragen Sie in Ihrem Fall nach UserFeeds.

Meteor.publish('feeds', function() { 
    this.autorun(function (computation) { 
     var feeds = _.pluck(UserFeeds.find({user: this.userId}, {fields: {feedid: 1}}).fetch(), 'feedid'); 
     return Feeds.find({_id: {$in: feeds}}); 
    }); 
}); 

Der wichtigste Teil ist, dass Sie die UserFeeds Felder nur feedid begrenzen, um sicherzustellen, autorun nicht erneut ausführen, wenn einige andere Feldänderungen in UserFeeds, ein Feld, das Sie nicht interessieren.

Verwandte Themen