Actualmente estoy tratando con handlebars.js en una aplicación express.js. Para mantener las cosas modulares, dividí todas mis plantillas en parciales.
Mi problema : no pude encontrar una manera de pasar variables a través de una invocación parcial. Digamos que tengo un parcial que se ve así:
<div id=myPartial>
<h1>Headline<h1>
<p>Lorem ipsum</p>
</div>
Supongamos que registré este parcial con el nombre 'myPartial'. En otra plantilla, puedo decir algo como:
<section>
{{> myPartial}}
</section>
Esto funciona bien, el parcial se representará como se esperaba y soy un desarrollador feliz. Pero lo que ahora necesito es una forma de pasar diferentes variables a través de esta invocación, para verificar dentro de un parcial, por ejemplo, si se da un título o no. Algo como:
<div id=myPartial>
{{#if headline}}
<h1>{{headline}}</h1>
{{/if}}
<p>Lorem Ipsum</p>
</div>
Y la invocación debería verse así:
<section>
{{> myPartial|'headline':'Headline'}}
</section>
más o menos.
Sé que puedo definir todos los datos que necesito antes de representar una plantilla. Pero necesito una forma de hacerlo como acabo de explicar. ¿Hay alguna manera posible?
fuente
this
, podría pasar en su propio contexto. Por ejemplo, defina datos adicionales para transferir, como{new_variable: some_data}
?{{> partialName {new_variable: some_data} }}
key=value
. ¿Hay algún problema que cubra esto en github?Por si acaso, esto es lo que hice para obtener argumentos parciales, más o menos. He creado un pequeño ayudante que toma un nombre parcial y un hash de parámetros que se pasarán al parcial:
La clave aquí es que los ayudantes de Handlebars aceptan un hash de argumentos similar a Ruby . En el código auxiliar vienen como parte del último argumento de la función
options
- en suhash
miembro. De esta manera, puede recibir el primer argumento, el nombre parcial, y obtener los datos después de eso.Entonces, probablemente desee devolver un mensaje
Handlebars.SafeString
del ayudante o usar "triple-stash"{{{
- para evitar que se escape doblemente.Aquí hay un escenario de uso más o menos completo:
Espero que esto ayude a alguien. :)
fuente
Esto es muy posible si escribe su propio ayudante. Estamos utilizando un
$
ayudante personalizado para lograr este tipo de interacción (y más):fuente
hbs.registerPartials(path.join(__dirname, '/views/partials'), function() { utils.precompileHandlebarsPartials(hbs); }); // Pre compile the partials precompileHandlebarsPartials : function(hbs) { var partials = hbs.handlebars.partials; for (var partial in partials) { if (typeof partials[partial] === 'string') { partials[partial] = hbs.handlebars.compile(partials[partial]); } }; }
Esto también se puede hacer en versiones posteriores del manillar usando la
key=value
notación:Permitiéndole pasar valores específicos a su contexto parcial.
Referencia: contexto diferente para el parcial # 182
fuente
La respuesta aceptada funciona muy bien si solo desea utilizar un contexto diferente en su parcial. Sin embargo, no le permite hacer referencia a ninguno de los contextos principales. Para pasar varios argumentos, debe escribir su propio ayudante. Aquí hay un asistente de trabajo para Manillares
2.0.0
(la otra respuesta funciona para las versiones<2.0.0
):Luego, en su plantilla, puede hacer algo como:
Y en su parcial, podrá acceder a esos valores como contexto como:
fuente
Parece que quieres hacer algo como esto:
Yehuda ya te dio una forma de hacerlo:
Pero para aclarar:
Para darle a su parcial sus propios datos, simplemente dele su propio modelo dentro del modelo existente, así:
En otras palabras, si este es el modelo que le está dando a su plantilla:
Luego agregue un nuevo objeto para ser dado al parcial:
childContext
se convierte en el contexto de lo parcial como dijo Yehuda: en eso, solo ve el campoanother
, pero no ve (o no le importa el camposome
). Si teníaid
en el modelo de nivel superior, y repiteid
nuevamente en el childContext, eso funcionará bien ya que el parcial solo ve lo que hay dentrochildContext
.fuente
Sí, llegué tarde, pero puedo agregar para los usuarios de Assemble : puede usar el
"parseJSON"
ayudante integrado http://assemble.io/helpers/helpers-data.html . (Descubierto en https://github.com/assemble/assemble/issues/416 ).fuente
No estoy seguro de si esto es útil, pero aquí hay un ejemplo de plantilla de Manillar con parámetros dinámicos pasados a un RadioButtons parcial en línea y al cliente (navegador) que muestra los botones de radio en el contenedor.
Para mi uso, se representa con Handlebars en el servidor y permite que el cliente lo termine. Con ella, una herramienta de formularios puede proporcionar datos en línea dentro de Manillares sin ayudantes.
Nota: este ejemplo requiere jQuery
fuente