Подтвердить что ты не робот

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

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

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

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

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

Вы можете использовать не-ложные значения раздела. 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/

Ответ 2

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

{{#items.length}}
    <ul>
        {{items}}
            <li>{{name}}</li>
        {{/items}}
    </ul>
{{/items.length}}

Ответ 3

Два других ответа не работают для реализации Ruby 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)