小胡子模板:如何为非空列表仅输出一次块

时间:2012-04-11 09:05:30

标签: mustache

如果我的列表为空,我想输出:

<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),但这感觉多余。

是否有更优雅的方式我只能为非空列表输出一次块?

3 个答案:

答案 0 :(得分:16)

如果您不想或不能重新格式化数据或模板引擎,您也可以在呈现items.length标记之前检查<ul>。有些人对此不以为然,但它肯定是Max答案的替代品。

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

答案 1 :(得分:4)

您可以使用部分的non-false valuesname必须是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 :(得分:1)

另外两个答案对于Moustache的Ruby实现不起作用。我的解决方案是发送一个额外的参数作为模板上下文的一部分; e.g。

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)