2014-11-11 8 views
8

Sto iterando attraverso una collezione in Meteor usando {{#each}} e vorrei sapere se sono nell'ultimo elemento, come posso fare in AngularJS mentre uso ngRepeat con $ last.In Meteor usando #each, controlla se l'elemento 'last' nella collezione ha raggiunto

Potrebbe essere usato, ad esempio, per la costruzione di enumerazioni leggibili umani come 'Mi piacciono i gatti, cani e delfini':

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> 

Esiste un modo per verificare questa condizione in Meteora?

+0

@ РСТȢѸФХѾЦЧШЩЪЫ ѢѤЮѦѪѨѬѠѺѮѰѲѴ, può per favore modificare il nome utente a qualcosa di meno antipatico? –

+2

Questa è una buona domanda. – Mitar

risposta

1

Questo non è ancora supportata in meteoriti (versione 1.0), ma è possibile tipo di aggiungerlo voi stessi facendo qualcosa di simile:

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 
      } 
     }) 
    } 
}) 

Tuttavia, questo non gioca piacevole con reattività (rendendolo funzionare correttamente con reattività è molto più difficile, il che credo sia il motivo per cui questa funzionalità non è ancora incorporata), ma se si restituisce un array semplice che non dipende da alcuna fonte di dati reattiva, questo dovrebbe funzionare correttamente.

+0

Ottimo @peppe e se stavo usando una collezione Meteor invece di un semplice array? –

+1

@ GerardCarbó, lo stesso principio si applica alle collezioni (recupera l'array tramite 'TheCollection.find(). Fetch()'): se nessun documento viene aggiunto, aggiornato o rimosso, questa soluzione funziona come un incantesimo. –

6

Utilizzando 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> 

lavorato con una fonte di dati reattivo per me con meteore 1.1.0.1 (non so quando Template.parentData() è stato introdotto nel meteorite).

+0

Come usare questo approccio quando si usa '{{#each this}}'? – Alex

+0

Ho avuto problemi con questo quando 'list' era una matrice di oggetti e' elem' era anche un oggetto. Non tornerebbe mai vero. Quindi ho dovuto modificare la terza riga con qualcosa di simile per farlo funzionare: 'return _.last (list) ._ id == elem._id;' – gkrizek

6

Se qualcuno di voi si sta chiedendo come fare lo stesso con i cursori di raccolta, c'è un modo molto più semplice grazie al pacchetto handlebar-helpers.

È quindi possibile utilizzare:

$ mappato - mapperà $ prima, $ scorso, e l'indice $ sul vostro cursore o matrice

combinato con $ ultimo aiuto nel modello del genere :

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

PS: questo funziona anche con le matrici

Problemi correlati