流星集合在模板中为空

Posted

技术标签:

【中文标题】流星集合在模板中为空【英文标题】:Meteor Collection empty in template 【发布时间】:2018-12-04 12:42:53 【问题描述】:

我处于 Meteor 项目的早期阶段,所有默认包都存在,包括自动发布。将 Collection Notes 添加到我的项目中工作正常并按预期显示。

当我添加第二个集合时。 Tags,复制相同的模式,总是空的。

所以我需要一些注意事项。我读过例如David Weldons list of common mistakes 但没有找到任何线索。

有两个模板显示两个集合,一个显示正常,另一个不显示。

集合的声明完全相同:

export const Tags = new Mongo.Collection('Tags');
export const Notes = new Mongo.Collection('Notes');

它们由相似、简单的模板显示,这些模板在我的 html 中引用:

<body>
  <div>
    #each tags
      > tag
    /each
  </div>
  <div>
    #each notes
      > note
    /each
  </div>
</body>

而且模板助手也是一样的:

Template.body.helpers(
  notes() 
    return Notes.find(,  sort:  createdAt: -1);
  ,
  tags() 
    let t = Tags.find();
    return t;
  ,
);

如果我在let t =... 之后中断,那么t.fetch() 会给出一个空数组。 (meteor mongo: db.Tags.find() 不是为空...)

tags()-helper 返回一个数组会正确显示该数据,所以很明显我错过了Tags-collection。

这可能是时间问题吗?我认为助手是被动的,因此应该处理这些事情。还是我需要查看明确的订阅,iron:routerwaitOn

修复:

正如@Jankapunkt 所指出的,我忘记将集合添加到服务器端启动。

【问题讨论】:

哪个集合没有显示? “不显示查找”是什么意思?这是否意味着console.log(NameOfCollection.find()) 不返回任何数据或屏幕上没有呈现任何内容? let t =... 之后有一个中断,然后t.fetch() 给出一个空数组。 您是否在启动时将Tags 导入到服务器和客户端? 谢谢@Jankapunkt,就是这样。将您的评论变成答案,以便我接受。 【参考方案1】:

为了成功地将 mongo 集合的数据自动发布到客户端,您需要将集合同时导入服务器和客户端(最好在启动时)。

示例

imports/MyCollection.js

export const MyCollection = new Mongo.Collection('mycollection');

server/main.js

import  MyCollection  from '../imports/MyCollection';

client/main.js

import  MyCollection  from '../imports/MyCollection';

如果您删除 autopublish 包,您将需要在服务器端添加发布并在客户端添加订阅。

进一步阅读:

https://guide.meteor.com/data-loading.html

https://guide.meteor.com/collections.html

【讨论】:

我想这意味着仅客户端 new Collection('name')(即使使用“名称”)只是创建 minimongo 集合,但无法连接到服务器端相应的集合。在这种情况下,我可能已经预料到会出现错误,但也许这是不可能的。 我认为它允许您在服务器和客户端上创建同名的不同集合是有目的的。我只是现在没有用例。

以上是关于流星集合在模板中为空的主要内容,如果未能解决你的问题,请参考以下文章

判断字符串为空为 null 为 whitespace 工具类

延迟加载的集合在junit中为空

Laravel mailchimp 事件属性在模板中为空

linux字符测试

循环删除Dictionary集合中为空的Key,其他集合均可改造

插入新对象时 Meteor 0.8.2 客户端集合为空