流星中的多个光标订阅

时间:2016-02-24 22:46:49

标签: javascript meteor

美好的一天!我正在流星出版物中返回两个游标。有问题的代码在这里:

Meteor.publish('members.checkedIn', function() {

let organizationId = OrganizationService.getOrganizationId(this.userId);
if (!organizationId) return this.ready();

let timeclockQuery = {
  organizationId: organizationId,
  entityType: 'member',
  timeOut: null
};

let timeclocks = Timeclock.find(timeclockQuery).fetch();

let memberIds = _.map(timeclocks, tc => {
  return { _id: tc.entityId };
});

let memberQuery = { $or: memberIds };

return Timeclock.find(timeclockQuery).count() == 0 ? 
  this.ready() : [
    Timeclock.find(timeclockQuery),
    Member.find(memberQuery)
  ];

});

一切都与我怀疑完全相同,但是当我在我的代码中时,我将一个成员计时(Aka timeOut字段将返回一个比之前更少的结果,因为timeOut !== null页面上的内容不是被动的。意思是当我转到这个页面,我看到了预期的变化,但它并没有按照说法“直播”。(一旦你订阅,会员查询似乎没有改变。)我应该把它切换为2个单独的订阅吗?或者可以任何你看到我做错了什么?

谢谢:)

额外的清晰度:了解成员是否在“商店”的唯一方法是查询timeOock为空的时间段(Aka他们还没有离开)

1 个答案:

答案 0 :(得分:0)

你基本上在这里做某种JOIN查询,当你查找一个可能会改变但却没有被动的变量时,你会用它来定义你的Collection上的查询:这不会对变量的变化产生反应

为了使其成为被动的,整个出版物需要反应性地检查你的计时器变量的变化。

为此,我使用了peerlibrary:reactive-publish这个包就可以做到这一点。

https://github.com/peerlibrary/meteor-reactive-publish

还有其他人可以查看。

基本用法如下:

Meteor.publish('subscribed-posts', function () {
  this.autorun(function (computation) {
    var user = User.findOne(this.userId, {fields: {subscribedPosts: 1}});

    return Posts.find({_id: {$in: user && user.subscribedPosts || []}});
  });
});

所以除了包装之外你的代码没有重大改变(并确保保持上下文(在autorun中使用self = this和self。)