当发布的游标基于另一个集合内容时,如何构建反应式发布?
How to build a reactive publication when the published cursor is based on another collection content?
我有两个合集 items
和 worksheet
。
每个工作表都有一个 item
数组字段,我在其中存储所有工作表 items
_id。基于此字段,我发布了当前工作表的项目。该出版物看起来像这样:
Meteor.publish("get_items", function(worksheetId) {
var currentWorksheet = Worksheets.findOne(worksheetId);
if (currentWorksheet.items) {
return Items.find({"_id":{$in:currentWorksheet.items}}, {});
} else {
console.log("no item to send");
return Items.find({"_id":null}, {});
}
}
return this.ready();
});
此发布已在当前页面 iron-router 控制器中订阅。
这是问题所在:
我使用具有模板级订阅的专用组件来更改当前工作表 items
字段。此组件加载到引导箱中。
当我更改当前工作表 items
字段时,我的主要出版物不会更新以将更改考虑在内。但是,如果我重新加载页面,更改将被考虑在内。
我应该如何设计我的出版物,以便它在依赖于另一个集合的情况下保持反应?
您可以使用 Meteor.publishComposite() 如下
Meteor.publishComposite('itemsByWorksheet', function (params) {
check(params, {
worksheetId: String
});
var worksheetId = params.worksheetId;
return {
find: function () {
return Worksheets.find({ worksheetId: worksheetId })
},
children: [
{
find: function (worksheet) {
return Items.find({_id: {$in: worksheet.items}})
}
}
]
}
});
这将创建一个响应式发布,它将根据原始工作表发布中的更改订阅项目。
此解决方案需要来自 atmosphere 的以下软件包:https://atmospherejs.com/reywood/publish-composite
您的订阅将如下所示:
Meteor.subscribe('itemsByWorksheet', {worksheetId: "<worksheet id goes here>"});
我有两个合集 items
和 worksheet
。
每个工作表都有一个 item
数组字段,我在其中存储所有工作表 items
_id。基于此字段,我发布了当前工作表的项目。该出版物看起来像这样:
Meteor.publish("get_items", function(worksheetId) {
var currentWorksheet = Worksheets.findOne(worksheetId);
if (currentWorksheet.items) {
return Items.find({"_id":{$in:currentWorksheet.items}}, {});
} else {
console.log("no item to send");
return Items.find({"_id":null}, {});
}
}
return this.ready();
});
此发布已在当前页面 iron-router 控制器中订阅。
这是问题所在:
我使用具有模板级订阅的专用组件来更改当前工作表 items
字段。此组件加载到引导箱中。
当我更改当前工作表 items
字段时,我的主要出版物不会更新以将更改考虑在内。但是,如果我重新加载页面,更改将被考虑在内。
我应该如何设计我的出版物,以便它在依赖于另一个集合的情况下保持反应?
您可以使用 Meteor.publishComposite() 如下
Meteor.publishComposite('itemsByWorksheet', function (params) {
check(params, {
worksheetId: String
});
var worksheetId = params.worksheetId;
return {
find: function () {
return Worksheets.find({ worksheetId: worksheetId })
},
children: [
{
find: function (worksheet) {
return Items.find({_id: {$in: worksheet.items}})
}
}
]
}
});
这将创建一个响应式发布,它将根据原始工作表发布中的更改订阅项目。
此解决方案需要来自 atmosphere 的以下软件包:https://atmospherejs.com/reywood/publish-composite
您的订阅将如下所示:
Meteor.subscribe('itemsByWorksheet', {worksheetId: "<worksheet id goes here>"});