如何在Meteor模板中按ID访问另一个集合?

时间:2014-11-25 11:09:15

标签: javascript mongodb meteor handlebars.js spacebars

我们说我有一个帖子集合,其数据如下:

var post1 = {
  title: "First post",
  post: "Post content",
  comments: [<comment id>, <another comment id>, <etc>]
};

我有一个相应的评论集。我已发布并订阅了这两个系列,并希望显示一篇包含该评论的帖子。

如何显示该特定帖子的评论?

<template name="post">
  <h1>{{title}}</h1>
  <p>{{post}}</p>
  {{#each comments}}
    // Only have access to the ID
  {{/each}}
</template>

我可以像这样创建一个帮手:

Template.post.helpers({
  displayComment: function(id) {
    return Comments.findOne(id).fetch().comment;
  }
});

并且做:

<template name="post">
    <h1>{{title}}</h1>
    <p>{{post}}</p>
    {{#each comments}}
      {{displayComment @index}}
    {{/each}}
  </template>

但是我必须为每个评论对象的属性等创建一个帮助器。

干净的方法是什么?我不想填充帖子对象上的评论字段,因为这意味着调用.fetch(),帖子将不再是被动的。

1 个答案:

答案 0 :(得分:1)

一些建议:

<template name="post">
  <h1>{{title}}</h1>
  <p>{{post}}</p>
  {{#each comments}}
    {{#with commentDetails}}
        {{userName}} //
        {{content}}  //  These are properties of a comment document
        {{upvotes}}  //
    {{/with}}
  {{/each}}
</template>

Template.post.helpers({
    commentDetails: function() {
        return Comments.findOne(this);
    }
});

这将通过查找当前with_idthis的值,将每个commentDetails块中的数据上下文设置为返回的注释对象each块中的帮助器。

另一种方法是单独使用each块,但让它迭代游标:

<template name="post">
  <h1>{{title}}</h1>
  <p>{{post}}</p>
  {{#each commentCursor}}
    {{content}}
    ... // other properties
  {{/each}}
</template>

Template.post.helpers({
    commentCursor: function() {
        return Comments.find({_id: {$in: this.comments}});
    }
});