美好的一天!我正在流星出版物中返回两个游标。有问题的代码在这里:
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他们还没有离开)
答案 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。)