2013-03-07 13 views
0

假設你有一堆博客文章,每篇文章都有一個「標題」和「類別」。如何在單個頁面上呈現所有帖子標題,每個帖子具有相同「類別」值的表格?流星:你如何在多個表中顯示一個集合,其中每個表是一組具有相同鍵值的對象?

我被按類別排序開始,所以在同一類的職位光標組合在一起:

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

但我通過在一個模板,通過此列表迭代掙扎{{ #each}},並使用Handlebars來檢測我何時到達一個新的「類別」,以便我可以開始一個新的,然後結束當我在類別的末尾。

我是以這種錯誤的方式來到的,還是有一種簡單的方法來做到這一點?

+0

而不是返回所有帖子,你可以按類別返回它?將類別存儲在單獨的集合中。 – Prashant 2013-03-07 06:18:39

+0

每個類別{ 每個帖子{ 渲染 } } – Prashant 2013-03-07 06:47:58

回答

0

我使用的解決方案是,在我的模板處理程序中,不是使用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對象,該模板也會被完全重新渲染。這是缺點。但有利的是,它的工作原理;)

相關問題