2

我有两个系列itemsworksheet.

每个工作表都有一个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字段时,我的主要出版物不会更新以将更改考虑在内。但是,如果我重新加载页面,则会考虑所做的更改。

我应该如何设计我的出版物以使其在依赖于另一个集合的情况下保持反应性?

4

1 回答 1

2

您可以使用 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>"});
于 2015-09-14T14:46:14.943 回答