流星出版物有计算

时间:2014-11-20 14:17:38

标签: meteor

我有2个收藏:Meteor.users和Projecs。 用户集合包含字段"项目"其中包含用户项目ID的数组。

"projects" : [ 
  "jut6MHx6a7kSALPEP",  
  "XuJNvq7KTRheK6dSZ"
]

此外,我还有一个针对用户项目的出版物:

Meteor.publish('projects', function() {
  var userProjects = Meteor.users.findOne(this.userId).projects;
  return Projects.find({_id: {$in: userProjects}});
});

一切正常,但是当我添加新项目(以及更新用户("项目"字段)这个项目中)时,反应性出版物不起作用。项目页面不包含最近添加的项目。它仅在我刷新页面时有效。

在路由器中进行订阅:

waitOn: function() { 
    return [
        Meteor.subscribe('projects')
        ]
  },

我该怎么做这个出版物?非常感谢。

3 个答案:

答案 0 :(得分:0)

是的,这是一个已知的"问题"。发布函数不具有反应性,因此Meteor.users.findOne(this.userId).projects仅在客户订阅时进行评估。如果您搜索" meteor reactive joins",例如https://www.discovermeteor.com/blog/reactive-joins-in-meteor/

,您会发现很多相关信息。

在您的情况下,客户端将始终可以访问他们的项目ID数组,对吗?那么最简单的解决方案可能是在客户端做类似的事情:

Tracker.autorun(function(){
    var user = Meteor.user()
    if(user){
        Meteor.subscribe(user.projects)
    }
})

因此,当客户注意到项目ID数组已更改时,它会更新订阅(我不确定是否需要将user.projects传递给订阅服务,但是我有点位如果使用与之前相同的参数调用订阅,则认为订阅不会被续订。

答案 1 :(得分:0)

这种情况正在发生,因为Meteor.users 不是被动的。我不知道背后的原因是什么,但是我看到很多开发人员,特别是那些试图通过发布非常酷的文章而着名的开发人员关于他们非常棒的应用程序,暴露了令牌。

因此,如果一些白痴将Meteor.users发布到浏览器,那就是一个安全漏洞。如果它是被动的,那将是最糟糕的,因为令牌将被实时更新。也许这对于那些并不真正知道他们正在做的新手来说是一个障碍。只是我对这个决定的看法。

此集合旨在用于管理用户,在登录后,用于存储数据是没有意义的。

答案 2 :(得分:0)

使用reactive-publish包(我是其中一位作者),你可以这样做:

Meteor.publish('projects', function () {
  this.autorun(function (computation) {
    var userProjects = Meteor.users.findOne(this.userId, {fields: {projects: 1}}).projects;
    return Projects.find({_id: {$in: userProjects}});
  });
});

请注意,只将第一个查询限制为projects,以便不会因其他字段的更改而重新运行autorun