Llamar a Helper dentro de IF Bloque en la plantilla de manillar
-
27-10-2019 - |
Pregunta
Estoy trabajando con el motor de plantilla de manillars.js y estoy tratando de encontrar una manera de hacer algo como esto (ejemplo artificial):
{{#if itemSelected "SomeItem"}}
<div>This was selected</div>
{{/if}
dónde itemSelected
es un ayudante registrado como este:
Handlebars.registerHelper("itemSelected", function(item) {
var selected = false;
// Lots of logic that determines if item is selected
return selected;
});
Recibo errores al intentar usar esta sintaxis para la plantilla, y no puedo encontrar ningún ejemplo que muestre este tipo de cosas. Veo bloques simples #if como este ...
{{#if myValueInContext}}
<div>This will show if myValueInContext results in a truthy value.</div>
{{/if}}
Pero no puedo entender cómo abordar el primer ejemplo. Tal vez me estoy acercando a esto mal.
Por cierto, etiqueté este bigote ya que no pude agregar una etiqueta de manillares a la pregunta.
Solución
No creo que esto vaya a funcionar. Si entiendo correctamente la documentación del manillar, el #IF es un bloque de bloque registrado y no toma otro ayudante registrado como argumento.
Según la documentación, puede implementarla así
Handlebars.registerHelper('ifItemSelected', function(item, block) {
var selected = false;
// lots of logic that determines if item is selected
if(selected) {
return block(this);
}
});
Luego deberías poder llamarlo con
{{#ifItemSelected SomeItem}}
This was selected
{{/ifItemSelected}
Pero tienes que asegurarte Algo tiene el formato adecuado. No veo una forma de usar un controlador registrado como condicional en una declaración IF.
Otros consejos
Debe agregar paréntesis alrededor de la invocación de ayudantes incrustados:
{{#if (itemSelected "SomeItem")}}
<div>This was selected</div>
{{/if}
Hice experimentos y verifiqué que simplemente funciona.
No estoy seguro si se menciona en la documentación del manillar. Aprendí el truco de los ejemplos de manillares-shouts.
Con la última versión (1.0.rc.1) de Manillars, debe escribir Sth como:
Handlebars.registerHelper('ifItemSelected', function(item, options) {
var selected = false;
// lots of logic that determines if item is selected
if (selected) {
return options.fn(this);
}
});
es decir. bloque (esto) se reemplaza por opciones.fn (esto)
Si también desea tener una opción más, 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}