Meteor:如何在多个表中显示集合,其中每个表都是一组具有相同键值的对象?

Meteor:如何在多个表中显示集合,其中每个表都是一组具有相同键值的对象?,meteor,collections,Meteor,Collections,假设你有一堆博客帖子,每个帖子都有一个“标题”和“类别”。如果每组文章都有一个表,并且具有相同的“类别”值,那么如何在单个页面上呈现所有文章标题 我从按类别排序开始,因此相同类别中的帖子在光标中分组: Template.postLists.posts = function() { return Posts.find({}, {sort:{category:1}}); } 但是我正在努力通过{{{each}}在模板中迭代这个列表,并使用手柄来检测何时到达一个新的“类别”,这样我就可以开始一个

假设你有一堆博客帖子,每个帖子都有一个“标题”和“类别”。如果每组文章都有一个表,并且具有相同的“类别”值,那么如何在单个页面上呈现所有文章标题

我从按类别排序开始,因此相同类别中的帖子在光标中分组:

Template.postLists.posts = function() {
  return Posts.find({}, {sort:{category:1}});
}
但是我正在努力通过{{{each}}在模板中迭代这个列表,并使用手柄来检测何时到达一个新的“类别”,这样我就可以开始一个新的,然后在类别结束时结束这个列表


我是不是走错了路,还是有一个简单的方法可以做到这一点?

我使用的解决方案是,在我的模板处理程序中,我没有使用Posts.find()返回游标,而是创建了一个JSON对象,该对象的结构可以由Handlebar模板处理(类别对象数组,其中每个类别都有一个帖子数组):

模板是这样的(但是使用表而不是UL,只是在这里使用UL进行更干净的演示):

{{#每个分类主题}
{{category}}
    {{{#每个帖子}
  • {{posts.title}
  • {{/每个}}
{{/每个}}

请注意,当您像这样返回一个对象(而不是Posts.find()返回的游标对象)时,Meteor的模板引擎失去了智能检测集合中只有一个对象发生更改的能力,并且无法修补DOM而不是完全重新呈现模板。因此,在这种情况下,即使数据库中更新了一个POST对象,模板也会完全重新呈现。这是缺点。但优点是它可以工作;)

您可以按类别返回它,而不是返回所有帖子?将类别存储在单独的集合中。每个类别{each post{render}
Template.postLists.categorizedPosts = function() {
    var allPosts = Posts.find({}, {sort:{category:1}}).fetch();

    // Then I iterate over allPosts with a loop, 
    // creating a new array of this structure:
    // for ...
    var catPosts = [ { category:"cat1", posts: [ {post1}, {post2} ] },
                     { category:"cat2", posts: [ {post3}, {post4}, {post5} ] },
                     // etc... 
                   ];
    // end loop
    return catPosts;
{{#each categorizedPosts}}
  {{category}}  
  <ul> 
    {{#each posts}}
    <li>{{posts.title}}</li>
    {{/each}}
  </ul>
{{/each}}