[英]Meteor collection not updating subscription on client
我對Meteor和Mongo很新,即使我不想要它,我也需要一些關系。
我有一個名為Feeds的Collection和另一個名為UserFeeds的Collection,我有一個feedid和一個userid,我在服務器上發布用戶feed,如下所示:
Meteor.publish('feeds', function(){
return Feeds.find({_id:{$in:_.pluck(UserFeeds.find({user:this.userId}).fetch(),'feedid')}});
});
我在UserFeeds上找到用戶,獲取它(返回一個數組)並將其選中只有feedid字段,然后在Feeds集合中找到這些feed。
並在客戶端訂閱如下:
Deps.autorun(function(){
Meteor.subscribe("feeds");
});
問題是,當我添加新的Feed和新的userfeed時,客戶端不會收到更改,但是當我刷新頁面時,會出現新的Feed。
知道我在這里缺少什么嗎?
謝謝。
我也遇到過這種情況。 事實證明,服務器上的發布函數不會被動地重新運行:如果它們返回一個Collection游標,就像你正在做的那樣(和大多數發布函數一樣),那么發布函數將運行一次而Meteor將存儲游標僅當光標內容發生變化時才發送更新。 這里重要的是,當query
更改時,Meteor 不會重新運行發布函數,也不會重新運行Collection.find(query)
。 如果你想重新運行發布函數,那么我到目前為止所做的方法是設置發布函數來接收參數。 這樣,客戶端的集合可以被動地更新,可以反應性地重新訂閱。 代碼看起來像:
// 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}});
});
我相信Meteorite包發布與關系旨在解決這個問題,雖然我沒有使用它。
編輯:我相信發布功能將在userId更改時重新運行,這意味着您可以進行服務器端檢查以確保用戶在發布敏感數據之前已登錄。
我認為你的問題是你在這里使用的.fetch()...
UserFeeds.find({user:this.userId}).fetch()
...去除反應性。
.fetch()返回一個數組而不是一個游標,該數組不會被激活。
試試這個 ...
Meteor.autosubscribe(function(){
Meteor.subscribe("feeds");
});
並在模板JS ...
Template.templateName.feeds = function()
return Feeds.find() # or any specific call
};
在HTML中......
{{#each feeds}}
do some stuff
{{else}}
no feed
{{/each}}
您可以使用反應式發布包(我是作者之一)。 它允許您創建依賴於另一個查詢結果的發布端點。 在您的情況下,查詢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}});
});
});
重要的是,您只能將UserFeeds
字段限制為feedid
,以確保在UserFeeds
(您不關心的字段)中的某些其他字段更改時不會重新運行autorun
運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.