Чи можуть вуси ітератувати масив верхнього рівня?


109

Мій об’єкт виглядає так:

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

І я хочу використовувати шаблон вуса, щоб виготовити з нього щось подібне:

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

Але як? Чи мені справді доводиться спочатку вбивати це в щось подібне?

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

Відповіді:


169

Ви можете зробити це так ...

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

Він також працює для таких речей ...

var obj = [{name: 'foo'}, {name: 'bar'}];
var tmp = '<ul>{{#.}}<li>{{name}}</li>{{/.}}</ul>';
Mustache.render(tmp, obj);

2
насправді шаблон спочатку: Mustache.render('<ul>{{#.}}<li>{{.}}</li>{{/.}}</ul>',['foo','bar','baz']);
Кай Карвер

Як отримати, наприклад, 2-й елемент масиву? Я намагаюся зробити {{.1}} з mustache.js, і це не працює.
тиліха

Н.М., зрозумів це: ви можете просто проігнорувати крапки: так {{1}} або якщо ви хочете зробити логічну перевірку, то {{# 1}} все, що {{/ 1}}
тиліха

8
Чи є ці особливості десь задокументовані? Я не бачу {{.}}, {{1}}або нічого подібного у вусах (5).
Даніель Любаров

Примітка: масив верхнього рівня не підтримується Hogan: github.com/twitter/hogan.js/isissue/74 . Використовуйте рішення з властивістю: stackoverflow.com/a/8360440/470117
MEMS

115

У мене була така ж проблема сьогодні вранці, і після невеликого експерименту я виявив, що ви можете використовувати {{.}} Для позначення поточного елемента масиву:

<ul>
  {{#yourList}}
  <li>{{.}}</li>
  {{/yourList}}
</ul>

1
Звідки походить назва змінної #yourList? ви можете показати зразок javascript фактичного відображення?
iwein

3
вам навіть не потрібно використовувати "yourList", ви можете просто використовувати ". тут також: Mustache.render('<ul>{{#.}}<li>{{.}}</li>{{/.}}</ul>',['foo','bar','baz']);
Кай Карвер

JavaScript буде Mustache.render('<ul>{{#.}}{{.}}{{/.}}</ul>', {yourList: ['foo','bar','baz']});
Dan Jordan

1
Зауважте, робіть це лише у тому випадку, якщо ви хочете менш читабельних шаблонів. Прийнята відповідь, хоч і не потрібна, є більш читабельним рішенням.
timoxley

7
Хтось знає, чому так, що ця інформація відсутня в документації? mustache.github.io/mustache.5.html
Джош

5

Спираючись на відповідь @ danjordan, це зробить те, що ви хочете:

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

повернення:

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

Він працює лише для масивів, а не для об'єктів, неможливо для {a:'foo',b:'bar',c:'baz'}... Як робити анонімні посилання під час ітерації об'єктів?
Пітер Краусс

1

Нижче наведено приклади візуалізації багатовимірного масиву в шаблоні:

Приклад 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);

Приклад 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);

Для тестового запуску збережіть наведені вище приклади у файлі під назвою 'test.js', у командному рядку запустіть наступну команду

nodejs test.js

-1

Я не думаю, що вуса можуть це зробити! (дивно) Ви можете перебирати список об’єктів, а потім отримувати доступ до атрибутів кожного об'єкта, але ви не можете переглядати простий список значень!

Отже, ви повинні перетворити свій список у:

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

і тоді ваш шаблон буде таким:

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

Мені це здається серйозною проблемою з вусами - будь-яка система шаблонів повинна мати можливість перебирати список простих значень!


4
Вам просто потрібно використовувати {{.}}. Дивіться мою відповідь нижче.
Енді Халл

2
Неправильні голоси вводять в оману. Ця відповідь правильна, оскільки {{.}} Не є частиною стандарту вуса, хоча він підтримується деякими реалізаціями. Немає портативного способу зробити це.
Yefu

це правильно, і дуже корисно для багатовимірного візуалізації. Знайдіть мій приклад, як
показано
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.