Как построить реактивную публикацию, когда публикуемый курсор основан на другом контенте коллекции?
У меня две коллекции items
а также worksheet
,
Каждый лист имеет item
поле массива, где я храню весь лист items
_Я бы. Исходя из этого поля, я публикую элементы для текущего рабочего листа. Издание выглядит так:
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
поле, моя основная публикация не обновляется, чтобы принять изменения во внимание. Тем не менее, если я перезагрузить страницу, изменения будут приняты во внимание.
Как мне спроектировать мою публикацию так, чтобы она оставалась реактивной, несмотря на зависимость от другой коллекции?
1 ответ
Вы можете использовать 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}})
}
}
]
}
});
Это создаст реактивную публикацию, которая будет подписываться на элементы на основе изменений в исходной публикации рабочего листа.
Для этого решения вам понадобится следующий пакет из атмосферы: https://atmospherejs.com/reywood/publish-composite
Ваша подписка будет выглядеть так:
Meteor.subscribe('itemsByWorksheet', {worksheetId: "<worksheet id goes here>"});