Шаблоны усов: Как вывести блок только один раз для непустых списков

Если мой список пуст, я хочу вывести это:

<code><div id="some-id">
</div>
</code>

Если мой список не пуст, я хочу вывести это:

<code><div id="some-id">
  <ul>
    <li>Item 1</li>
    <li>Item 2</li>
    <li>etc</li>
  </ul>
</div>
</code>

Обратите внимание, что я вывожу<ul> а также</ul> тегиat most onceи только если список не пустой.

Следующий код близок к тому, как я сделал бы это в PHP, но явно ошибочен:

<code><div id="some-id">
{{#items}}
  <ul>
{{/items}}

{{#items}}
    <li>{{name}}</li>
{{/items}}

{{#items}}
  </ul>
{{/items}}
</div>
</code>

Еслиitems список из 3 пунктов, я собираюсь получить 3<ul>- очевидно, не то, что я хочу.

Я понимаю, что мог бы установить какой-то другой ключ в качестве логического флага (hasItemsвозможно), но это кажется излишним.

Есть ли более элегантный способ вывести блок только один раз для непустого списка?

 low_rents29 июн. 2016 г., 14:19
По моему мнению (и 4 года спустя) до сих пор нет удовлетворительного решения этой проблемы в "усах" насколько мне известно. нам нужна противоположность «перевернутой секции»; - раздел, который оказываетonly once если значение ключа истинно (ключ существует, непустой список, значение ключа равно true, ...)!

Ответы на вопрос(3)

Два других ответа не работают для реализации усиков в Ruby. Моим решением было отправить дополнительный параметр как часть контекста шаблона; например

template = <<EOF
{{#has_items}}
<ul>
    {{#items}}
        <li>{{.}}</li>
    {{/items}}
</ul>
{{/has_items}}
EOF
items = ['one', 'two', 'three']
context = { items: items, has_items: items.any? }
Mustache.render(template, context)

низм шаблонов, вы также можете просто проверитьitems.length перед рендерингом<ul> теги. Некоторые люди осуждают это, но это определенно альтернатива ответу Макса.

{{#items.length}}
    <ul>
        {{items}}
            <li>{{name}}</li>
        {{/items}}
    </ul>
{{/items.length}}
 18 авг. 2017 г., 17:43
Наличие этой функциональности зависит от языка, только немного лучше, чем необходимость изменить структуру модели, чтобы она соответствовала представлению
 G Mawr10 мар. 2014 г., 15:04
Ницца. Это работает только с JavaScript-реализацией JavaScript, правда?
 G Mawr29 авг. 2014 г., 16:16
Я используюPHP version of Mustache который имеетcount function, а не свойство или метод. Тем не менее, я просто попробовал это сArrayIterator а также{{#items.count}} работает как положено. Что здорово. Спасибо!
 G Mawr01 апр. 2014 г., 22:09
... реализация JavaScriptMustache...
 27 авг. 2014 г., 16:51
да, но у большинства языков есть какое-то свойство или метод, который вы можете проверить, чтобы получить длину массива ... с помощью Java, это.sizeи т.д.should перевести на большинство языков.
Решение Вопроса

Вы могли бы использоватьневерные значения раздела.name должен был быть объектом внутриitems

data = { 'items' : { 'name' : ["Item 1", "Item 2", "etc"] } };

Ваш шаблон будет выглядеть так:

<div id="some-id">
    {{#items}}
    <ul>
        {{#name}}
        <li>{{.}}</li>
        {{/name}}
    </ul>
    {{/items}}
</div>

Вот пример на jsFiddle, показывающий рендерингitems объект с именами и без -http://jsfiddle.net/maxbeatty/fpQwk/

 G Mawr12 апр. 2012 г., 13:14
Хммм. Это интересная идея. Я, вероятно, представляю данные как{ 'itemsContainer' : { 'items' : [ { 'name' : 'item 1' }, { 'name' : 'item 2' }, { 'name' : 'etc' } ] } };, Спасибо!
 10 окт. 2013 г., 01:19
если вы не хотите менять свою структуру данных, измените ваш шаблонизатор
 27 сент. 2013 г., 16:23
необходимость изменения структуры данных только потому, что преобразование шаблона не поддерживает конкретный случай, кажется мне очень ограничивающим.

Ваш ответ на вопрос