Meteor中基于模板的订阅

Meteor中基于模板的订阅,meteor,subscription,Meteor,Subscription,我是流星队的新手。我天真地认为,服务器上的“发布”会将集合的一组/子集发送给客户端,使之成为同步的minimongo集合,但更重要的是,订阅的客户端只允许处理已发布的数据集(不多也不少)。但是,在模板帮助器内订阅时,它看起来像: 1) 您不能使用“发布”的名称(那么它有什么用途?) 2) 您必须查询集合并再次进行筛选(为什么要在“发布”中进行筛选?) 代码如下: meteor:PRIMARY> db.products.insertMany([ ... { "name" : "product

我是流星队的新手。我天真地认为,服务器上的“发布”会将集合的一组/子集发送给客户端,使之成为同步的minimongo集合,但更重要的是,订阅的客户端只允许处理已发布的数据集(不多也不少)。但是,在模板帮助器内订阅时,它看起来像:

1) 您不能使用“发布”的名称(那么它有什么用途?)

2) 您必须查询集合并再次进行筛选(为什么要在“发布”中进行筛选?)

代码如下:

meteor:PRIMARY> db.products.insertMany([
... { "name" : "product_1", "color" : "black", "taste" : "salty" }    ,
... { "name" : "product_2", "color" : "black", "taste" : "sweet" }    ,
... { "name" : "product_3", "color" : "white", "taste" : "salty" }    ,
... { "name" : "product_4", "color" : "white", "taste" : "sweet" }  ])
模板:

<template name="products">
     <h2> All of them:</h2>
        {{#each allOfThem}}
              <li>
                {{name}} {{color}} {{taste}}
              </li>
        {{/each}}
     <h2> salty ones:</h2>
        {{#each saltyOnes}}
              <li>
                {{name}} {{color}} {{taste}}
              </li>
        {{/each}}
</template>
在main.js-client中:

Template.products.onCreated( function() {
    Meteor.subscribe("saltyProducts");
});
Template.products.helpers({
    allOfThem: function(){
        return Products.find( {});
    },
    saltyOnes: function(){
       return Products.find( { taste : "salty"} );
    }   
});
结果是:

All of them, instead of my subscription..
product_1 black salty
product_2 black sweet
product_3 white salty
product_4 white sweet

salty ones, but I had to filter in the helper..
product_1 black salty
product_3 white salty

当然我已经尝试过了:
returnsaltyproducts.find({})但这不起作用。再说一次,定义“saltyProducts”出版物的意义是什么?

你正沿着一条路走,你会遇到Meteor mergebox。将项发布到集合名称时,它们将与已发布到该集合名称的任何其他项合并

例如,您可以将您的salty项目发布到products集合,但一旦发布(例如,“仅”发布sweet项目),salty和sweet都将发布到客户端

在这个场景中,是的,您是对的,您必须在客户端上进一步过滤。您正在筛选已发布的项集,而不是数据库中的项集

这是有办法的。您可以定义一个名为“saltyItems”的客户端集合,并将产品的子集发布到该集合中。我在使用一个名为publish composite的包时做到了这一点:

虽然复合发布可能超出了此处的需要,但它确实允许您定义特定集合的名称,然后您可以在客户端上定义该集合,以便对特定的已发布数据集进行查找

编辑:

你问的是如何在客户端查找产品,而不是“saltyProducts”。Products是在定义集合时(可能)设置的变量,它与集合“Products”(我假设)相关联。而“saltyProducts”仅仅是出版物的名称

但如果愿意,您可以创建一个名为“SaltyProducts”的临时客户端集合,如下所示:

const SaltyProducts = new Meteor.Collection('saltyProducts');
this.subscribe('saltyProducts');
return SaltyProducts.find({});
您可以在如下模板中订阅:

const SaltyProducts = new Meteor.Collection('saltyProducts');
this.subscribe('saltyProducts');
return SaltyProducts.find({});
。。。您可以在以下帮助器中找到:

const SaltyProducts = new Meteor.Collection('saltyProducts');
this.subscribe('saltyProducts');
return SaltyProducts.find({});
虽然这看起来可能正是你想要的,但事实并非如此。因为你写的出版商的结果仍然会将结果放在名为“产品”的集合中

我认为还有其他方法可以解决这个问题,但我上面提到的软件包将允许您将所有产品(即咸味产品)的子集发布到您想要称之为集合的任何内容(“咸味产品”)中


然后,在客户端上,您将能够执行预期的find(),并获得预期的结果。

您是否关闭了autopublish软件包?因为如果这是服务器上唯一的出版物,那么,除非启用了autopublish package,否则您不应该得到您发布的所有产品,只是咸的产品。

是否关闭了autopublish package?如果这是您在服务器上唯一的出版物,那么,除非启用了autopublish软件包,否则您不应该得到您发布的所有产品,只是咸味的产品。非常感谢Artus,您成就了我的一天!然而,还有一个小问题:我给出版物起的“saltyProducts”这个名字有什么用?(因为在client/template/helper中,我仍然必须订阅“Products”,它现在代表简化集)@Jalmince,我更新了我的答案以帮助您回答这个问题。@Jalmince
saltyProducts
是您的出版物名称。与数据集的标识符类似,您将从
.publish()
方法返回。这是为您提供的信息,比如调用
.subscribe()
thks Zim时希望接收的数据集。实际上,阿图斯给了我解决办法。但我会记下你的,因为当我站在学习曲线上更高一点的时候..关于同一个客户集合中合并出版物的问题,你也可以参考@ghybs,我以前没有见过percolate:find from publication。谢谢你的链接。@Jalmince请接受解决你问题的答案,这样人们就会知道你的问题已经解决了。