2013-05-28 8 views
20

Ho un helper chiamato printArray che stampa solo tutti gli elementi di un array. Funziona alla grande quando definisco l'array in JS e lo passo all'helper tramite un oggetto di contesto. Quello che voglio fare è di definire la matrice nel modello, come:Passa array scritto nel template all'helper meteora/manubri

{{printArray arr=[1, 3, 4] }} 

Purtroppo, per il momento questo diventa per il mio aiuto, i arr punti chiave per undefined. C'è qualche sintassi valida per ottenere l'array all'interno del mio helper senza definirlo in javascript?

risposta

2

è necessario utilizzare un altro supporto che restituisce un array

Template.ArrayDemo.helpers({ 
    arrayValues: [1, 2, 3], 
    printArray: function(arr) { 
     for (i = 0; i < arr.length; i++) { 
      console.log(arr[i]); 
     } 
    } 
}); 

ora si può fare

{{printArray arr=arrayValues}}

1

Hai provato a passare solo il valore tra parentesi dell'array?

{{printArray [1, 3, 4]}} 

So che è possibile passare facilmente negli oggetti, come argomenti per i metodi di manubri helper:

{{printArray {arr: [1, 3, 4]} }} 

Date un'occhiata a questi metodi di supporto impressionante, la maggior parte dei quali mi ha donato da altrove, alcuni di cui ho scritto o ottimizzato ... sono il mio punto di partenza di riferimento sul tema:

https://github.com/zeroasterisk/Presenteract/blob/master/client/lib/handlebar-helpers.js

+2

Questi sembrano impressionanti, ma devo essere equivoco qualcosa - ottengo 'Expecting 'CLOSE', 'DATA', 'STRING', 'Integer', 'BOOLEAN', 'ID', 'Settembre', ha ottenuto 'INVALID'' sulla parentesi graffa aperta dell'oggetto. Questa sintassi può essere ammessa in manubri semplici ma non consentita nella meteora? –

+0

Grazie per il link al tuo codice. Puoi indicare dove stai _utilizzando_ questi aiutanti? –

+0

Ecco un esempio di 'getSession' https://github.com/zeroasterisk/Presenteract/blob/master/client/views/about.html#L68 – zeroasterisk

6

È possibile utilizzare JavaScript arguments array per realizzare qualcosa di simile. L'array arguments consente di accedere a tutti i valori passati alla funzione quando viene richiamato.

Questo vi permetterà di utilizzare la sintassi del genere:

{{printArray 1 3 4}} 

Il codice è simile al seguente:

Handlebars.registerHelper('printArray', function() { 
    //Last argument is the options object. 
    var options = arguments[arguments.length - 1]; 

    //Skip the last argument. 
    for(var i = 0; i < arguments.length - 1; ++i) { 
     //Do your thing with each array element. 
    } 

    //Return your results... 
    return ''; 
}); 
2

si può quasi raggiungere questo obiettivo con l'uso di eval(), utilizzando un aiuto come questo :

Handlebars.registerHelper('printArray', function(values) { 
    var array = eval(values); 

    if (array.constructor === Array()) { 
    ... 
    } 
} 

Quanto sopra consente di chiamare questo dal modello:

{{printArray '[0, 1, 2]'}} 

L'unico avvertimento a questo metodo è che devi passare l'array come una stringa.

1

È possibile definire un aiutante array come di seguito.

Handlebars.registerHelper('array', function() { 
    return Array.prototype.slice.call(arguments, 0, -1); 
} 

{{printArray (array 1 3 4)}} 
Problemi correlati