2013-08-06 12 views
11

Czy można przekazać obiekt JavaScript/hasz do wywołania pomocnika Handlebars? Chciałbym zrobić coś takiego:Przejść JavaScript obiektu/hash do pomocnika 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. Obecnie produkuje się następujący błąd

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' 

Ewentualnie mógłbym prawdopodobnie to i podzielić zrobić na „”, ale nie jestem lubiący składni:

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

UWAGA: I specjalnie nie chce przekazać dane/atrybuty (id, klasa, rozmiar, itp.) do metody template() jako obiektu JSON. Chcę wszystko w szablonie.

Odpowiedz

13

Rozwiązany. Zrobiłem to:

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(' ') + ' />'); 
}); 

A szablon:

<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 (na dole strony), można przekazać w zmiennej liczby parametrów do metody pomocnika i będą dostępne w options.hash (zakładając, że "options" jest parametrem metody helper). A co jest również miłe w tym, że można używać nazwanych parametrów, a kolejność parametrów nie ma znaczenia.

+1

Jak możemy przekazać tekst i wartości dynamicznie ?. Próbowałem, ale to nie mogło być ćwiczeniem. Tak czy inaczej? '{{textField id =" text_field_1 "class =" some-class "size =" 30 "data-coś =" wartość danych "{{this.number}}}}' Właściwie muszę dodać wartość do danych- atrybut z tekstem – Newbie

9

Znalazłem inny najlepszy sposób przekazywania przedmiotów.

Szablon:

{{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 dla zachowania odwzorowania hashowania, zgodnie z pierwotnym żądaniem plakatu - chociaż zwykle podoba mi się interfejs API zaakceptowanej odpowiedzi, ponieważ naśladuje atrybuty HTML. – srquinn

+1

Przyjęta odpowiedź działa najlepiej, gdy znasz klucze z góry. Jeśli nie, jest to przyzwoite obejście. – mynameistechno

Powiązane problemy