2013-08-06 12 views
11

È possibile passare un oggetto/hash JavaScript in una chiamata helper di Handlebars? Mi piacerebbe fare qualcosa di simile:Passa l'oggetto/hash JavaScript all'helper di Handlebars?

<label>Label here</label> 
{{#textField {'id':'text_field_1', 'class':'some-class', size:30} }}{{/textField}} 
<p>Help text here.</p> 

Here is a jsFiddle. Attualmente produce il seguente errore

Uncaught Error: Parse error on line 3: 
...bel> {{#textField {'id':'text_field_1' 
----------------------^ 
Expecting 'CLOSE', 'CLOSE_UNESCAPED', 'STRING', 'INTEGER', 'BOOLEAN', 'ID', 'DATA', 'SEP', got 'INVALID' 

In alternativa, probabilmente avrei potuto fare questo e divisa su '', ma io non sono appassionato di sintassi:

{{#textField "'id'='text_field_1','class'='some-class',size=30"}}{{/textField}} 

NOTA: I specificamente non vogliamo passare dati/attributi (id, classe, dimensione, ecc.) nel metodo template() come oggetto JSON. Voglio tutto nel modello.

risposta

13

Risolto. Ho fatto questo:

Helper:

Handlebars.registerHelper('textField', function(options) { 
    var attributes = []; 

    for (var attributeName in options.hash) { 
     attributes.push(attributeName + '="' + options.hash[attributeName] + '"'); 
    } 

    return new Handlebars.SafeString('<input type="text" ' + attributes.join(' ') + ' />'); 
}); 

E il modello:

<label>Label here</label> 
{{textField id="text_field_1" class="some-class" size="30" data-something="data value"}} 
<p>Help text here.</p> 

Per the documentation (in fondo alla pagina), è possibile passare in un numero variabile di parametri ad un metodo di supporto e saranno disponibili in options.hash (assumendo che "options" sia un parametro del metodo helper). E ciò che è anche bello di questo è che puoi usare i parametri con nome, e l'ordine dei parametri non ha importanza.

+1

Come possiamo passare un testo e valore in modo dinamico ?. Ho provato quanto segue ma questo non poteva allenamento. Comunque? '{{textField id =" text_field_1 "class =" some-class "size =" 30 "data-something =" valore dati "{{this.number}}}} In realtà ho bisogno di aggiungere valore ai dati- attributo con testo – Newbie

9

Ho trovato un altro modo migliore per passare gli oggetti.

Template:

{{textField dataAttribs='{"text":"Hello", "class": "text-field"}'}} 

Helper:

Handlebars.registerHelper('textField', function(options) { 
    var attribs; 

    attribs = JSON.parse(options.hash.dataAttribs); 
    console.log(attribs.text + " -- " + attribs.class); 
    ...... 
    ........ 
}); 

JSFiddle for this

+0

+1 per mantenere il mapping hash come originariamente richiesto dal poster - sebbene tendo ad apprezzare l'API della risposta accettata un po 'di più in quanto imita gli attributi HTML. – srquinn

+1

La risposta accettata funziona meglio quando si conoscono i tasti in anticipo. Se non lo fai, questa è una soluzione decente. – mynameistechno

Problemi correlati