Meteor集合未在客户端更新订阅

Bel*_*dar 9 javascript mongodb meteor

我对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')}});
});
Run Code Online (Sandbox Code Playgroud)

我在UserFeeds上找到用户,获取它(返回一个数组)并将其选中只有feedid字段,然后在Feeds集合中找到这些feed.

并在客户端订阅如下:

Deps.autorun(function(){
   Meteor.subscribe("feeds");
});
Run Code Online (Sandbox Code Playgroud)

问题是,当我添加新的Feed和新的userfeed时,客户端不会收到更改,但是当我刷新页面时,会出现新的Feed.

知道我在这里缺少什么吗?

谢谢.

zor*_*lak 16

我也遇到过这种情况.事实证明,服务器上的发布函数不会被动地重新运行:如果它们返回一个Collection游标,就像你正在做的那样(和大多数发布函数一样),那么发布函数将运行一次而Meteor将存储游标仅当光标内容发生变化时才发送更新.这里重要的是Meteor 不会重新运行发布功能,因此Collection.find(query),当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}});
});
Run Code Online (Sandbox Code Playgroud)

我相信Meteorite包发布与关系旨在解决这个问题,虽然我没有使用它.

编辑:我相信发布功能在userId更改时重新运行,这意味着您可以进行服务器端检查以确保用户在发布敏感数据之前已登录.


Kri*_*r K 11

我认为你的问题是你在这里使用的.fetch()...

UserFeeds.find({user:this.userId}).fetch()
Run Code Online (Sandbox Code Playgroud)

...去除反应性.

.fetch()返回一个数组而不是一个游标,该数组不会被激活.

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


小智 1

尝试这个 ...

Meteor.autosubscribe(function(){
    Meteor.subscribe("feeds");
});
Run Code Online (Sandbox Code Playgroud)

并在模板 JS 中...

Template.templateName.feeds = function() 
  return Feeds.find() # or any specific call
};
Run Code Online (Sandbox Code Playgroud)

在 HTML 中...

{{#each feeds}}
   do some stuff
{{else}}
   no feed
{{/each}}
Run Code Online (Sandbox Code Playgroud)