在Meteor中使用#each,检查集合中是否有“last”元素

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

标签: javascript meteor meteor-blaze spacebars

我正在使用{{#each}}遍历Meteor中的一个集合,我想知道我是否在最后一个元素中,就像我在AngularJS中可以做的那样,同时使用带有$ last的ngRepeat。

例如,它可用于构建人类可读的枚举,例如“我喜欢猫,狗和海豚”:

Template.myTemplate.helpers({
    likedAnimals: function(){return ['dogs','cats','dolphins'];}
});

<template name='myTemplate'>
    I like  
    {{#each likedAnimals}}
        {{#if !$first && !$last}}, {{/if}}
        {{#if $last}} and {{/if}}
        {{this}}
    {{/each}}
</template>

有没有办法在Meteor中检查这个条件?

3 个答案:

答案 0 :(得分:7)

如果你们中的任何一个想知道如何对收集游标进行同样的操作,那么感谢handlebar-helpers包就会有更简单的方法。

然后你可以使用:

  

$ mapped - 将$ first,$ last和$ index映射到光标或数组

结合模板中的$ last helper:

{{#each $mapped myCursor}}
  {{name}}{{#unless $last}},{{/unless}}
{{/each}}

PS:这也适用于数组

答案 1 :(得分:6)

使用underscore.js

Template.registerHelper('last',
    function(list, elem) {
        return _.last(list) === elem;
    }
);

<template name='myTemplate'>
    {{#each likedAnimals}}
        {{#if last ../likedAnimals this}} I'm the last ! {{/if}}
    {{/each}}
</template>

使用meteor 1.1.0.1处理我的反应数据源(我不知道什么时候在流星中引入了Template.parentData())。

答案 2 :(得分:1)

meteor(版本1.0)不支持此功能,但您可以通过执行以下操作来自行添加:

Template.myTemplate.helpers({
    likedAnimals: function(){
        var animals = ['dogs','cats','dolphins']
        return animals.map(function(animal, index){
            return {
                name: animal,
                isFirst: index==0,
                isLast: index==animals.length-1
            }
        })
    }
})

然而,这对反应性起作用并不好(使其在反应性方面正常工作要困难得多,我想这就是为什么它还没有内置功能),但是如果你返回一个简单的数组& #39;不依赖于任何被动数据源,这应该可以正常工作。