0

假设你有一堆博客文章,每个文章都有一个“标题”和“类别”。您将如何在单个页面上呈现所有帖子标题,其中每组具有相同“类别”值的帖子都有一个表格?

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

Template.postLists.posts = function() {
  return Posts.find({}, {sort:{category:1}});
}

但是我正在努力通过 {{#each}} 在模板中迭代这个列表,并使用 Handlebars 来检测我何时到达一个新的“类别”,这样我就可以开始一个新的,然后在我' m 在类别的末尾。

我是以错误的方式来的,还是有一种简单的方法可以做到这一点?

4

1 回答 1

1

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

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;

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

{{#each categorizedPosts}}
  {{category}}  
  <ul> 
    {{#each posts}}
    <li>{{posts.title}}</li>
    {{/each}}
  </ul>
{{/each}}

请注意,当您返回这样的对象(而不是 Posts.find() 返回的光标对象)时,Meteor 的模板引擎将失去智能检测集合中只有一个对象何时发生更改的能力,并改为修补 DOM完全重新渲染模板。所以在这种情况下,即使在数据库中更新了单个 Posts 对象,模板也会完全重新呈现。这就是缺点。但好处是它有效;)

于 2013-03-08T19:33:53.020 回答