La moustache peut-elle parcourir un tableau de niveau supérieur?

109

Mon objet ressemble à ceci:

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

Et je veux utiliser un modèle de moustache pour en produire quelque chose comme ceci:

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

Mais comment? Dois-je vraiment le brancher dans quelque chose comme ça d'abord?

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

Réponses:

169

Vous pouvez le faire comme ça ...

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

Cela fonctionne aussi pour des choses comme ça ...

var obj = [{name: 'foo'}, {name: 'bar'}];
var tmp = '<ul>{{#.}}<li>{{name}}</li>{{/.}}</ul>';
Mustache.render(tmp, obj);
Dan Jordan
la source
2
en fait, le modèle vient en premier: Mustache.render('<ul>{{#.}}<li>{{.}}</li>{{/.}}</ul>',['foo','bar','baz']);
Kai Carver
Comment obtenir, par exemple, le 2ème élément du tableau? J'essaye de faire {{.1}} avec moustache.js et ça ne marche pas.
thouliha
NM, compris: vous pouvez simplement ignorer les points: donc {{1}} ou si vous voulez faire une vérification logique, alors {{# 1}} peu importe {{/ 1}}
thouliha
8
Ces fonctionnalités sont-elles documentées quelque part? Je ne vois pas {{.}}, {{1}}ou quelque chose de semblable à moustache (5).
Daniel Lubarov
Remarque: le tableau de niveau supérieur n'est pas pris en charge par Hogan: github.com/twitter/hogan.js/issues/74 . Utilisez la solution avec une propriété: stackoverflow.com/a/8360440/470117
mems
115

J'ai eu le même problème ce matin et après une petite expérimentation, j'ai découvert que vous pouvez utiliser le {{.}} Pour faire référence à l'élément actuel d'un tableau:

<ul>
  {{#yourList}}
  <li>{{.}}</li>
  {{/yourList}}
</ul>
Andy Hull
la source
1
D'où vient le nom de la variable #yourList? pouvez-vous montrer un exemple javascript du rendu réel?
iwein
3
vous n'avez même pas besoin d'utiliser "yourList", vous pouvez simplement utiliser "." ici aussi: Mustache.render('<ul>{{#.}}<li>{{.}}</li>{{/.}}</ul>',['foo','bar','baz']);
Kai Carver
Le JavaScript serait Mustache.render('<ul>{{#.}}{{.}}{{/.}}</ul>', {yourList: ['foo','bar','baz']});
Dan Jordan
1
Remarque: ne procédez ainsi que si vous souhaitez des modèles moins lisibles. La réponse acceptée, bien que non "obligatoire", est une solution plus lisible.
timoxley
7
Est-ce que quelqu'un sait pourquoi cette information est absente de la documentation? moustache.github.io/mustache.5.html
Josh
5

En vous basant sur la réponse de @ danjordan, cela fera ce que vous voulez:

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

retour:

<ul><li>foo</li><li>bar</li><li>baz</li></ul>
Kai Carver
la source
Cela ne fonctionne que pour les tableaux, pas pour les objets, impossible pour {a:'foo',b:'bar',c:'baz'}... Comment faire des références anonymes lors d'une itération sur des objets?
Peter Krauss le
1

Voici les exemples pour rendre un tableau multidimensionnel dans un modèle:

Exemple 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);

Exemple 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);

Pour le test, enregistrez les exemples ci-dessus dans le fichier appelé 'test.js', exécutez la commande suivante en ligne de commande

nodejs test.js
Bhupender Keswani
la source
-1

Je ne pense pas que la moustache puisse faire ça! (étonnamment) Vous pouvez parcourir une liste d'objets, puis accéder aux attributs de chaque objet, mais vous ne pouvez pas sembler itérer sur une simple liste de valeurs!

Vous devez donc transformer votre liste en:

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

puis votre modèle serait:

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

Pour moi, cela semble être un problème grave avec Moustache - tout système de modèle devrait pouvoir boucler sur une liste de valeurs simples!

Nick Perkins
la source
4
Il vous suffit d'utiliser {{.}}. Voir ma réponse ci-dessous.
Andy Hull
2
Les votes négatifs sont trompeurs. Cette réponse est correcte en ce que {{.}} Ne fait pas partie du standard moustache, bien qu'il soit pris en charge par certaines implémentations. Il n'existe aucun moyen portable de le faire.
Yefu
celui-ci est juste, et très utile pour le rendu multidimensionnel. Veuillez trouver mon exemple ci
Bhupender Keswani