本出版物的目标是发布团队已“解锁”并满足先决条件的问题。它工作正常,但是当团队解决其他问题时,该出版物不会被动地更新(添加到team.solved字段)。
我已经发现这是因为Teams.findOne({})的结果;查询不会被动反应,因此team.solved字段永远不会更改。是否有更好的设计允许它被动地更新,或者我是否必须将其更改为Teams.find()并使用.observeChanges()?
Meteor.publish("problems", function () {
if(!this.userId) return [];
var user = Meteor.users.findOne(this.userId);
if(!user.profile.team) return [];
var team = Teams.findOne({_id:user.profile.team});
return Problems.find({requirements: {$not: {$elemMatch: {$nin: team.solved}}}});
});
如果我在这里使用任何不寻常的约定,请告诉我。
答案 0 :(得分:0)
有一些不同的软件包设计可以解决这些类型的问题,reywood:publish-composite和peerlibrary:active-publish浮现在脑海中。
要使用peerlibrary执行此操作:被动发布,在语法上更简单的IMO,您只需将代码包装在自动运行中,如下所示:
Meteor.publish("problems", function () {
this.autorun(function() {
if(!this.userId) return [];
var user = Meteor.users.findOne(this.userId);
if(!user.profile.team) return [];
var team = Teams.findOne({_id:user.profile.team});
return Problems.find({requirements: {$not: {$elemMatch: {$nin: team.solved}}}});
});
});