Meteor - 如何限制模板级订阅的范围

时间:2016-04-13 14:01:24

标签: javascript meteor meteor-blaze

我有一个集合的两个出版物。一个发布所有数据,另一个发布用户特定数据。我想使用首页上的数据来显示一般数据和用户特定数据。 因此,Main模板包含两个子模板:

主要模板:

<template name="index">

    {{> testAll }}

    {{> testUser }}

</template>

模板&#39; testAll&#39;和&#39; testUser&#39;由于数据是模板特定的,因此他们有自己的订阅相应的出版物。

出版物:

Meteor.publish('dataAll', function() {
    let data = Data.find({});
    if (data) {
        return data;
    }
    return this.ready();
});

Meteor.publish('dataUser', function() {
    let data = Data.find({userId: this.userId});
    if (data) {
        return data;
    }
    return this.ready();
});

订阅:

testAll.js

Template.testAll.onCreated(() => {
    let template = Template.instance();
    template.subscribe('dataAll'); 
});

testUser.js

Template.testUser.onCreated(() => {
    let template = Template.instance();
    template.subscribe('dataUser'); 
});

问题:两个模板订阅的数据都可以访问,而不是作用于每个模板。

示例(条形图不应相互嵌套,而是单独显示):

enter image description here

问题:如何设置每个模板的范围,以便订阅的数据只能在特定模板中访问?

即使我从一个模板中删除订阅,另一个模板仍然可以访问它:

示例(已删除testUser.js的订阅):

enter image description here

1 个答案:

答案 0 :(得分:1)

订阅不会创建单独的数据上下文,它们用于决定将哪些数据放在本地数据库副本中。您应该像对待任何数据库一样对待本地数据库,特别是客户端只有一个全局副本。如果要限制特定数据上下文或查询,则应在查询本身中执行此操作。换句话说,您应该永远依赖于您对本地数据库中的内容以及不是什么的知识,因为应用程序的其他部分可以影响该状态。您应该始终在特定位置查询所需的数据。

因此,在testUser模板中,使用Data.find({userId: this.userId}) 获取数据以及订阅数据。