2011-06-11 9 views
28

estoy trabajando con motor de plantillas Handlebars.js y estoy tratando de encontrar una manera de hacer algo como esto (ejemplo artificioso):Calling ayudante Dentro de si el bloque de manillares Plantilla

{{#if itemSelected "SomeItem"}} 
    <div>This was selected</div> 
{{/if} 

donde itemSelected es una marca registrada ayudante de la siguiente manera:

Handlebars.registerHelper("itemSelected", function(item) { 
    var selected = false; 
    // Lots of logic that determines if item is selected 
    return selected; 
}); 

tengo errores al intentar utilizar esta sintaxis para la plantilla, y no puedo encontrar ningún ejemplo que muestra este tipo de cosas. Veo bloques #if simples como esto ...

{{#if myValueInContext}} 
    <div>This will show if myValueInContext results in a truthy value.</div> 
{{/if}} 

Pero, no puedo encontrar la manera de abordar el primer ejemplo. Tal vez me estoy acercando a esto mal.

Por cierto, etiqueté este bigote porque no pude agregar una etiqueta de manubrio a la pregunta.

+0

Se corrigió la etiqueta quitando el bigote y agregando handlebars.js – Rajat

Respuesta

30

No creo que esto vaya a funcionar. Si entiendo la documentación del manillar correcta, el #if es un asistente de bloque registrado por sí mismo y no toma otro asistente registrado como argumento.

De acuerdo con la documentación que puede poner en práctica de esa manera


Handlebars.registerHelper('ifItemSelected', function(item, block) { 
    var selected = false; 
    // lots of logic that determines if item is selected 

    if(selected) { 
    return block(this); 
    } 
}); 

Después usted debe ser capaz de llamar con


{{#ifItemSelected SomeItem}} 
    This was selected 
{{/ifItemSelected} 

pero hay que asegurarse de SomeItem tiene el formato correcto . No veo una forma de utilizar un controlador registrado como condicional en una instrucción if.

+0

Perfecto. Esto funcionó bien. ¡Gracias! – Kevin

+0

La respuesta de @gnowoel podría ser una mejor opción para los manubrios modernos –

43

Con la última versión (1.0.rc.1) del manillar, usted tiene que escribir algo gustaría:

Handlebars.registerHelper('ifItemSelected', function(item, options) { 
    var selected = false; 
    // lots of logic that determines if item is selected 

    if (selected) { 
    return options.fn(this); 
    } 
}); 

decir. bloque (esto) se sustituye por options.fn (este)

http://handlebarsjs.com/block_helpers.html#conditionals

+4

A partir de la última versión de manillar, esta debería ser la respuesta aceptada –

4

Si usted quiere tener una opción más también, necesitará este código:

Handlebars.registerHelper('ifItemSelected', function(item, options) { 
    var selected = false; 
    // lots of logic that determines if item is selected 

    if (selected) { 
    return options.fn(this); 
    } 
    else { 
    return options.inverse(this); 
} 
}); 

Usado con:

{{#ifItemSelected SomeItem}} 
    This was selected 
{{else}} 
    This was not selected 
{{/ifItemSelected} 
64

Debe agregar paréntesis alrededor del asistente de introversión incorporado ion:

{{#if (itemSelected "SomeItem")}} 
    <div>This was selected</div> 
{{/if} 

Hice experimentos y verifiqué que simplemente funciona.

No estoy seguro de si se menciona en la documentación de los manubrios. Aprendí el truco de los ejemplos de handlebars-layouts.

+12

Esto debería ser más arriba. – Aerowind

+10

Sí, esta es una [subexpresión] (http://handlebarsjs.com/expressions.html#subexpressions). Es oficialmente compatible, por lo que este es el enfoque más simple. – Pathoschild

+4

gracias! eso debe marcarse como la respuesta correcta. – kokeksibir

Cuestiones relacionadas