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.

¿Fue útil?

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)

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

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}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top