如果我的列表为空,我想输出:
<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
),但这感觉多余。
是否有更优雅的方式我只能为非空列表输出一次块?
答案 0 :(得分:16)
如果您不想或不能重新格式化数据或模板引擎,您也可以在呈现items.length
标记之前检查<ul>
。有些人对此不以为然,但它肯定是Max答案的替代品。
{{#items.length}}
<ul>
{{items}}
<li>{{name}}</li>
{{/items}}
</ul>
{{/items.length}}
答案 1 :(得分:4)
您可以使用部分的non-false values。 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 :(得分: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)