¿Puede bigote iterar una matriz de nivel superior?

109

Mi objeto se ve así:

['foo','bar','baz']

Y quiero usar una plantilla de bigote para producir algo como esto:

"<ul><li>foo</li><li>bar</li><li>baz</li></ul>"

¿Pero cómo? ¿De verdad tengo que convertirlo en algo como esto primero?

{list:['foo','bar','baz']}
greim
fuente

Respuestas:

169

Puedes hacerlo así ...

Mustache.render('<ul>{{#.}}<li>{{.}}</li>{{/.}}</ul>', ['foo','bar','baz']);

También funciona para cosas como esta ...

var obj = [{name: 'foo'}, {name: 'bar'}];
var tmp = '<ul>{{#.}}<li>{{name}}</li>{{/.}}</ul>';
Mustache.render(tmp, obj);
Dan Jordan
fuente
2
en realidad, la plantilla es lo primero: Mustache.render('<ul>{{#.}}<li>{{.}}</li>{{/.}}</ul>',['foo','bar','baz']);
Kai Carver
¿Cómo obtengo, por ejemplo, el segundo elemento de la matriz? Estoy intentando hacer {{.1}} con mustache.js y no funciona.
thouliha
NM, lo resolví: puedes ignorar los puntos: así que {{1}} o si quieres hacer una verificación lógica, entonces {{# 1}} lo que sea {{/ 1}}
thouliha
8
¿Están documentadas estas características en alguna parte? No veo {{.}}, {{1}}ni nada parecido en bigote (5).
Daniel Lubarov
Nota: Hogan no admite la matriz de nivel superior: github.com/twitter/hogan.js/issues/74 . Use la solución con una propiedad: stackoverflow.com/a/8360440/470117
mems
115

Tuve el mismo problema esta mañana y después de un poco de experimentación descubrí que puedes usar {{.}} Para referirte al elemento actual de una matriz:

<ul>
  {{#yourList}}
  <li>{{.}}</li>
  {{/yourList}}
</ul>
Andy Hull
fuente
1
¿De dónde viene el nombre de la variable #yourList? ¿Puede mostrar una muestra de JavaScript de la representación real?
iwein
3
ni siquiera necesita usar "yourList", puede usar "." aquí también: Mustache.render('<ul>{{#.}}<li>{{.}}</li>{{/.}}</ul>',['foo','bar','baz']);
Kai Carver
El JavaScript sería Mustache.render('<ul>{{#.}}{{.}}{{/.}}</ul>', {yourList: ['foo','bar','baz']});
Dan Jordan
1
Tenga en cuenta que solo haga esto si desea plantillas menos legibles. La respuesta aceptada, aunque no "requerida", es una solución más legible.
timoxley
7
¿Alguien sabe por qué esta información está ausente en la documentación? moustache.github.io/mustache.5.html
Josh
5

Sobre la base de la respuesta de @ danjordan, esto hará lo que quieras:

Mustache.render('<ul>{{#.}}<li>{{.}}</li>{{/.}}</ul>',['foo','bar','baz']);

regresando:

<ul><li>foo</li><li>bar</li><li>baz</li></ul>
Kai Carver
fuente
Funciona solo para matrices, no para objetos, imposible para {a:'foo',b:'bar',c:'baz'}... ¿Cómo hacer referencias anónimas cuando se itera sobre objetos?
Peter Krauss
1

A continuación se muestran los ejemplos para renderizar una matriz multidimensional en una plantilla:

Ejemplo 1

'use strict';

var Mustache = require('mustache');

var view = {test: 'div content', multiple : ['foo', 'bar'], multiple_2 : ['hello', 'world']};
var template = '<div>{{test}}</div><ul>{{#multiple}}<li>{{.}}</li>{{/multiple}}</ul><ul>{{#multiple_2}}<li>{{.}}</li>{{/multiple_2}}</ul>';

var output = Mustache.render(template, view);

console.log(output);

Ejemplo 2

'use strict';

var Mustache = require('mustache');

var view = {test: 'div content', multiple : [{name: 'foo', gender: 'male'}, {name: 'bar', gender: 'female'}], multiple_2 : [{text: 'Hello', append: '**', prepend: '**'}, {text: 'World', append: '**', prepend: '**'}]};
var template = '<div>{{test}}</div><ul>{{#multiple}}<li>Hello my name is {{name}}. And I am {{gender}}</li>{{/multiple}}</ul><ul>{{#multiple_2}}<li>{{prepend}}_{{text}}_{{append}}</li>{{/multiple_2}}</ul>';

var output = Mustache.render(template, view);

console.log(output);

Para la ejecución de prueba, guarde los ejemplos anteriores en el archivo llamado 'test.js', ejecute el siguiente comando en la línea de comandos

nodejs test.js
Bhupender Keswani
fuente
-1

¡No creo que el bigote pueda hacer esto! (sorprendentemente) Puede iterar sobre una lista de objetos y luego acceder a los atributos de cada objeto, ¡pero parece que no puede iterar sobre una lista simple de valores!

Entonces, debes transformar tu lista en:

[ {"value":"foo"},{"value":"bar"},{"value":"baz"} ] 

y luego tu plantilla sería:

<ul>
  {{#the_list}}
  <li>{{value}}</li>
  {{/the_list}}
</ul>

Para mí, esto parece un problema grave con Moustache: ¡cualquier sistema de plantilla debería poder recorrer una lista de valores simples!

Nick Perkins
fuente
4
Solo necesita usar {{.}}. Vea mi respuesta a continuación.
Andy Hull
2
Los votos en contra son engañosos. Esta respuesta es correcta en que {{.}} No es parte del estándar de bigote, aunque es compatible con algunas implementaciones. No hay una forma portátil de hacer esto.
Yefu
éste es correcto y muy útil para la representación multidimensional. Encuentre mi ejemplo de la siguiente manera
Bhupender Keswani