17

如果我的列表是空的,我想输出这个:

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

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

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

请注意,我最多输出<ul>and</ul>标记一次,并且仅当列表非空时。

以下代码与我在 PHP 中的执行方式很接近,但显然是错误的:

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

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

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

如果items是 3 项列表,我会得到 3<ul>的 - 显然不是我想要的。

我意识到我可以将其他一些键设置为布尔标志(hasItems也许),但这感觉是多余的。

有没有更优雅的方法可以只为非空列表输出一次块?

4

3 回答 3

18

如果您不想或不能重新格式化您的数据或模板引擎,您也可以items.length在渲染<ul>标签之前进行检查。有些人对此不以为然,但这绝对是 Max 答案的替代方案。

{{#items.length}}
    <ul>
        {{items}}
            <li>{{name}}</li>
        {{/items}}
    </ul>
{{/items.length}}
于 2013-10-17T12:52:53.997 回答
6

您可以使用部分的非假值name必须是里面的一个对象items

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

您的模板看起来像:

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

items这是 jsFiddle 上的一个示例,显示了具有名称和不具有名称的对象的呈现- http://jsfiddle.net/maxbeatty/fpQwk/

于 2012-04-12T05:52:44.913 回答
1

其他两个答案不适用于 Mustache 的 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)
于 2017-05-19T19:43:32.453 回答