Как построить реактивную публикацию, когда публикуемый курсор основан на другом контенте коллекции?

У меня две коллекции 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>"});
Другие вопросы по тегам