2

と の 2 つのコレクションがitemsありworksheetます。

各ワークシートには、すべてのワークシート_iditemを格納する配列フィールドがあります。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();
});

この出版物は、現在のページのアイアン ルーター コントローラーで購読されています。

問題は次のとおりです。

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}})
                }
            }
        ]
    }
});

これにより、元のワークシート パブリケーションの変更に基づいてアイテムをサブスクライブするリアクティブ パブリケーションが作成されます。

このソリューションには、atmosphere の次のパッケージが必要です: https://atmospherejs.com/reywood/publish-composite

サブスクリプションは次のようになります。

Meteor.subscribe('itemsByWorksheet', {worksheetId: "<worksheet id goes here>"});
于 2015-09-14T14:46:14.943 に答える