Kann Schnurrbart ein Array der obersten Ebene iterieren?

109

Mein Objekt sieht so aus:

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

Und ich möchte eine Schnurrbartvorlage verwenden, um daraus etwa Folgendes zu erstellen:

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

Aber wie? Muss ich es wirklich zuerst in so etwas eintauchen?

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

Antworten:

169

Sie können es so machen ...

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

Es funktioniert auch für solche Dinge ...

var obj = [{name: 'foo'}, {name: 'bar'}];
var tmp = '<ul>{{#.}}<li>{{name}}</li>{{/.}}</ul>';
Mustache.render(tmp, obj);
Dan Jordan
quelle
2
Eigentlich kommt die Vorlage zuerst: Mustache.render('<ul>{{#.}}<li>{{.}}</li>{{/.}}</ul>',['foo','bar','baz']);
Kai Carver
Wie bekomme ich zum Beispiel das 2. Element des Arrays? Ich versuche {{.1}} mit mustache.js zu machen und es funktioniert nicht.
Thouliha
NM, hat es herausgefunden: Sie können die Punkte einfach ignorieren: also {{1}} oder wenn Sie eine logische Prüfung durchführen möchten, dann {{# 1}} was auch immer {{/ 1}}
thouliha
8
Sind diese Funktionen irgendwo dokumentiert? Ich sehe nicht {{.}}, {{1}}oder etwas ähnliches in Schnurrbart (5).
Daniel Lubarov
Hinweis: Das Array der obersten Ebene wird von Hogan nicht unterstützt: github.com/twitter/hogan.js/issues/74 . Verwenden Sie die Lösung mit einer Eigenschaft: stackoverflow.com/a/8360440/470117
mems
114

Ich hatte heute Morgen das gleiche Problem und nach ein wenig Experimentieren stellte ich fest, dass Sie mit {{.}} Auf das aktuelle Element eines Arrays verweisen können:

<ul>
  {{#yourList}}
  <li>{{.}}</li>
  {{/yourList}}
</ul>
Andy Hull
quelle
1
Woher kommt der Name der Variablen #yourList? Können Sie ein Javascript-Beispiel des tatsächlichen Renderings anzeigen?
iwein
3
Sie müssen nicht einmal "yourList" verwenden, sondern nur "." auch hier: Mustache.render('<ul>{{#.}}<li>{{.}}</li>{{/.}}</ul>',['foo','bar','baz']);
Kai Carver
Das JavaScript wäre Mustache.render('<ul>{{#.}}{{.}}{{/.}}</ul>', {yourList: ['foo','bar','baz']});
Dan Jordan
1
Beachten Sie, dass Sie dies nur tun, wenn Sie weniger lesbare Vorlagen wünschen. Die akzeptierte Antwort, wenn auch nicht "erforderlich", ist eine besser lesbare Lösung.
Timoxley
6
Weiß jemand, warum diese Informationen in der Dokumentation fehlen? mustache.github.io/mustache.5.html
Josh
5

Aufbauend auf der Antwort von @ danjordan wird dies tun, was Sie wollen:

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

Rückkehr:

<ul><li>foo</li><li>bar</li><li>baz</li></ul>
Kai Carver
quelle
Es funktioniert nur für Arrays, nicht für Objekte, unmöglich für {a:'foo',b:'bar',c:'baz'}... Wie werden anonyme Referenzen beim Iterieren über Objekte erstellt?
Peter Krauss
1

Im Folgenden finden Sie Beispiele zum Rendern eines mehrdimensionalen Arrays in einer Vorlage:

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

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

Speichern Sie für den Testlauf die obigen Beispiele in der Datei 'test.js' und führen Sie den folgenden Befehl in der Befehlszeile aus

nodejs test.js
Bhupender Keswani
quelle
-1

Ich glaube nicht, dass Schnurrbart das kann! (überraschend) Sie können eine Liste von Objekten durchlaufen und dann auf die Attribute jedes Objekts zugreifen, aber Sie können scheinbar nicht über eine einfache Liste von Werten iterieren!

Sie müssen Ihre Liste also in Folgendes umwandeln:

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

und dann wäre Ihre Vorlage:

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

Für mich scheint dies ein ernstes Problem mit Moustache zu sein - jedes Vorlagensystem sollte in der Lage sein, eine Liste einfacher Werte zu durchlaufen!

Nick Perkins
quelle
4
Sie müssen nur {{.}} Verwenden. Siehe meine Antwort unten.
Andy Hull
2
Die Abstimmungen sind irreführend. Diese Antwort ist insofern richtig, als {{.}} Nicht Teil des Schnurrbartstandards ist, obwohl sie von einigen Implementierungen unterstützt wird. Es gibt keine tragbare Möglichkeit, dies zu tun.
Yefu
Dieser ist richtig und sehr nützlich für mehrdimensionales Rendern. Bitte finden Sie mein Beispiel wie
folgt