2014-11-11 1 views
8

Я выполняю итерацию через коллекцию в Meteor с помощью {{#each}}, и я хотел бы знать, есть ли я в последнем элементе, как я могу сделать в AngularJS при использовании ngRepeat с $ last.В Meteor, использующем #each, проверьте, достиг ли элемент «last» в коллекции

Он может быть использован, например, для построения читаемых перечислений человека, как «Я люблю кошка, собака и дельфин»:

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?

+0

@ РСТȢѸФХѾЦЧШЩЪЫ ѢѤЮѦѪѨѬѠѺѮѰѲѴ, пожалуйста, вы можете изменить свое имя на что-то менее отвратительное? –

+2

Это хороший вопрос. – Mitar

ответ

1

Это не поддерживается в метеора еще (версия 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 
      } 
     }) 
    } 
}) 

Однако это не играет хорошо с реакционной способностью (что делает его работать с реактивностью гораздо сложнее, и я думаю, это причина, почему это еще не встроенная функция), но если вы вернете простой массив, который не зависит от какого-либо источника реактивных данных, это должно работать нормально.

+0

Отличный @peppe, и если бы я использовал Meteor Collection вместо простого массива? –

+1

@ GerardCarbó, тот же принцип применяется к коллекциям (извлекает массив через 'TheCollection.find(). Fetch()'): если никакие документы не добавляются, не обновляются или не удаляются, это решение работает как шарм. –

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> 

работал с реактивным источником данных для меня с метеором 1.1.0.1 (я не знаю, когда Template.parentData() была введена в метеора).

+0

Как использовать этот подход при использовании '{{#each this}}'? – Alex

+0

У меня возникли проблемы с этим, когда 'list' был массивом объектов, а' elem' тоже был объектом. Это никогда не вернется. Поэтому мне просто нужно было отредактировать третью строку для чего-то вроде этого, чтобы она работала: 'return _.last (list) ._ id == elem._id;' – gkrizek

6

Если вам интересно, как сделать то же самое с курсорами коллекции, есть более простой способ благодаря пакету handlebar-helpers.

Вы могли бы использовать:

$ сопоставляется - сопоставляются $ первого, $ последнего, и $ индекса на курсор или массив

в сочетание с $ последним помощником в шаблоне, как, что :

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

PS: это также работает с массивами

 Смежные вопросы

  • Нет связанных вопросов^_^