2013-03-28 116 views
9

我对流星和Mongo相当陌生,即使我不需要它,我也需要一些关系。未更新客户端订阅的流星集合

我有一个名为饲料和另一个名为UserFeeds在那里我有一个feedid和用户标识集合,我发布了用户这样的服务器上饲料:

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"); 
}); 

的问题是,当我添加一个新饲料和新userfeed客户端没有收到的变化,但是当我刷新页面新饲料确实出现。

任何想法,我在这里失踪?

谢谢。

+0

是什么面临这种情况,要解决这个问题---- http://stackoverflow.com/questions/42652958/how-to-update-data-getting-from-meteor-subscription-when-value-更新-某处 – 2017-03-10 10:26:51

回答

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}} 
+0

嗨,这个问题是不是在客户端上,而是在服务器,客户端渲染饲料就好了,当创建一个新的进料和相关用户不会推动改变的问题客户。 – Beldar 2013-03-28 15:56:38

11

我觉得你的问题是, .fetch()你在这里使用...

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

...消除反应性。

.fetch()返回一个数组而不是一个游标,并且该数组不会被动。

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

15

我碰到这个。事实证明,服务器上的发布函数不会被反应性地重新运行:如果它们返回一个Collection游标,就像你正在做的那样(并且和大多数发布函数一样),那么publish函数将运行一次,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}}); 
}); 

相信陨石包publish-with-relations设计来解决这个问题,虽然我没有用它。

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

+0

我遇到同样的问题,我正在使用组/角色的Alanning Roles软件包,并试图根据用户角色(哪个更改)过滤发布。我正在铁路路由器'waitOn'中订阅,所以我想我需要将它移出某处。你会推荐在'create'或者'rendered'中移动订阅吗? – CodeChimp 2015-02-21 13:28:58

+0

如果有三个集合:用户,项目和权限,该怎么办?项目根据权限发布给用户。权限可以改变,我们希望立即反映更改。我们不能只接受用户ID或权限ID或由因安全原因“Meteor.publish”功能的客户端的有效权限,对不对? – gumkins 2015-10-22 08:39:08

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确保autorunUserFeeds一些其他领域的变化,场你不关心不重新运行。