我是Meteor的新手。我天真地认为服务器上的“发布”会将一个集合的集合/子集发送到客户端到同步的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中 - 服务器:
Meteor.startup(() => {
Meteor.publish('saltyProducts', function(){
return Products.find( { taste : "salty"} );
});
});
在main.js中 - 客户端:
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
我当然试图这样做:return saltyProducts.find( {} );
但这不起作用。同样,定义“saltyProducts”出版物的重点是什么?
答案 0 :(得分:1)
你正走向一条你将要遇到Meteor合并箱的道路。将项目发布到集合名称时,它们将与已发布到该集合名称的任何其他项目合并。
例如,您可以将咸味物品发布到产品系列,但是一旦您发布了“只是”甜味物品,咸味和甜味就会发布给客户。
在这种情况下,是的,你是对的,你必须进一步过滤客户端。您要过滤已发布的项目集,而不是数据库中的项目集。
有办法解决这个问题。您可以定义一个名为“saltyItems”的客户端集合,并将一部分产品发布到该集合中。我在使用名为publish-composite的包时已经完成了这个:
https://github.com/englue/meteor-publish-composite
虽然复合发布可能比您需要的更多,但它确实允许您定义临时集合的名称,然后您可以在客户端上定义该名称,以便对该特定的已发布数据集进行查找。编辑:
你问的是在产品上做客户端查找,而不是“saltyProducts”。产品是您定义集合时(可能)设置的变量,它与集合“产品”(我假设)相关联。而“saltyProducts”仅仅是发布的名称。
但如果您愿意,可以创建一个名为“SaltyProducts”的临时客户端集合,如下所示:
const SaltyProducts = new Meteor.Collection('saltyProducts');
您可以使用以下模板订阅:
this.subscribe('saltyProducts');
...你可以在这样的帮手中找到:
return SaltyProducts.find({});
虽然这可能看起来像正是你想要的,但事实并非如此。因为您编写的发布者的结果仍会将结果放在名为“products”的集合中。
我认为还有其他方法,但我上面提到的包将允许您将所有产品的子集(即咸的产品)发布到您想要称之为集合的任何产品(“saltyProducts”)。 / p>
然后,在客户端上,您将能够执行您期望的find(),并获得您期望的结果。
答案 1 :(得分:0)
您是否关闭了自动发布包?因为如果这是你在服务器上唯一的出版物,那么,除非启用了autopublish包,否则你不应该拥有你发布的所有产品,只有咸的产品。