not hbs handlebars example compile javascript templates handlebars.js mustache

javascript - handlebars - npm hbs



Handlebars.js usando../ para hacer referencia al contexto principal (1)

Digamos que tengo la siguiente plantilla JSON y handlebars.js:

JSON

{ rootPath: ''/some/path/'', items:[ { title: ''Hello World'', href: ''hello-world'' }, { title: ''About'', href: ''about'' }, { title: ''Latest News'', href: ''latest-news'' } }

Modelo

<script id="test-template" type="text/x-handlebars-template"> <ul class="nav"> {{#each items}} <li><a href="{{../rootPath}}{{href}}">{{title}}</a></li> {{/each}} </ul> </script>

La plantilla de arriba funciona, hasta que quiero filtrar elementos. Digamos que tenemos 2 listas una impar y la otra par, aquí hay una plantilla simple para impar:

<script id="test-template" type="text/x-handlebars-template"> <ul class="nav"> {{#each items}} {{#isOdd @index}} <li><a href="{{../rootPath}}{{href}}">{{title}}</a></li> {{/isOdd}} {{/each}} </ul> </script>

Y el ayudante registrado:

// isOdd, helper to identify Odd items Handlebars.registerHelper(''isOdd'', function (rawValue, options) { if (+rawValue % 2) { return options.fn(this); } else { return options.inverse(this); } });

Los ayudantes funcionan como se esperaba y solo se representan los elementos impares; sin embargo, la referencia al contexto principal se pierde, por lo que la directiva {{../rootPath}} ~~ no puede representar ~~ representa un valor vacío.

¿Hay alguna manera de pasar el contexto principal a través del bloqueo de ayuda?


Modificar

<a href="{{../rootPath}}{{href}}"> to this: <a href="{{../../rootPath}}{{href}}">

¿Por qué? porque la instrucción if está en un contexto interno, por lo que primero debe subir un nivel y es por eso que debe agregar ../

Ver más detalles en: https://github.com/wycats/handlebars.js/issues/196