9

我对 Meteor 和 Mongo 很陌生,即使我不想要它,我也需要一些关系。

我有一个名为 Feeds 的集合和另一个名为 UserFeeds 的集合,其中我有一个 feedid 和一个 userid,我在服务器上发布用户提要,如下所示:

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

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

并像这样在客户端上订阅:

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

问题是当我添加一个新的提要和一个新的用户提要时,客户端没有收到更改,但是当我刷新页面时,新的提要确实出现了。

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

谢谢。

4

4 回答 4

16

我也遇到过这种情况。事实证明,服务器上的发布函数不会响应式地重新运行:如果它们返回一个 Collection 游标,就像你正在做的那样(和大多数发布函数一样),那么发布函数将运行一次,Meteor 将存储游标并且仅在光标的内容更改时才发送更新。这里重要的是 Meteor不会重新运行发布功能,因此也不会重新运行Collection.find(query), whenquery更改。如果您希望发布函数重新运行,那么到目前为止我所做的方法是设置发布函数以接收参数。这样,其集合确实会响应式更新的客户端可以响应式地重新订阅。代码看起来像:

// 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 包publish-with-relations旨在解决这个问题,虽然我没有使用过。

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

于 2013-03-30T12:35:38.307 回答
11

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

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

…消除反应性。

.fetch() 返回一个数组而不是游标,并且该数组不会是反应性的。

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

于 2013-03-28T21:49:58.177 回答
1

尝试这个 ...

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}}
于 2013-03-28T15:24:12.250 回答
0

您可以使用reactive-publish包(我是作者之一)。它允许您创建依赖于另一个查询结果的发布端点。在您的情况下,查询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确保autorun当其他字段更改时不会重新运行UserFeeds,您不关心的字段。

于 2015-10-03T11:10:58.560 回答