【问题标题】:meteor: Iterating over a collection by field value流星:按字段值迭代集合
【发布时间】:2014-06-20 13:04:40
【问题描述】:

我有带有类别字段和名称字段的项目,例如:

{ category: 'CategoryOne', name: "ItemOne" },
{ category: 'CategoryOne', name: "ItemTwo" },
{ category: 'CategoryTwo', name: "ItemThree" },
... etc

我想做的是在类别标题下显示这些。

我是流星新手,有很多时间做两件事:

(1) 获取类别的反应式列表,或 (2) 遍历项目,按类别分组显示。

我不确定这里正确的 Meteor 方法是什么。

【问题讨论】:

    标签: meteor


    【解决方案1】:

    不幸的是 minimongo 还不支持聚合,所以这有点困难。以下是我将如何处理它。

    首先创建 2 个模板助手。第一个只是将类别列表放在一起并返回一个类别名称数组,第二个将类别名称作为参数并返回该类别中所有记录的游标。

    Template.categories.helpers({
        categories: function(){
            var added = [];
            return Items.find().map(function (item) {
                if(_(added).indexOf(item.category) === -1){
                    return item.category;
                }
            });
        },
        categoryItems: function(category){
            return Items.find({category:category});
        }
    });
    

    接下来,模板需要嵌套的 {{#each}} 块,第一个块遍历类别数组并将类别名称作为下一个帮助器的参数传递给下一个。

    <template name="categories">
        {{#each categories}}
            <h1>{{this}}</h1>
            <ul>
            {{#each items this}}
                <li>{{name}}</li>
            {{/each}}
            </ul>
        {{/each}}
    </template>
    

    【讨论】:

    • 我把它翻译成Coffeescript,确实是一个可行的解决方案。我在 if 语句的工作中遇到了一点麻烦,所以我只是使用 map() 构建了一个数组,并在结果上调用了 _.uniq()。我还将那里的 find() 调用更改为按类别排序,因此 uniq() 可以获得已排序的提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2016-09-06
    相关资源
    最近更新 更多