我想用 Mustache 实现以下逻辑:
{{#if users.length > 0}}
<ul>
{{#users}}
<li>{{.}}</li>
{{/users}}
</ul>
{{/if}}
// eg. data = { users: ['Tom', 'Jerry'] }
我是否应该修改
users
结构以满足需要?例如:
{{#hasUsers}}
<ul>
{{#users}}
<li>{{.}}</li>
{{/users}}
</ul>
{{/hasUsers}}
// eg. data = { hasUsers: true, users: ['Tom', 'Jerry'] }
抱歉,这可能已经太晚了。但我有类似的要求并找到了更好的方法来做到这一点:
{{#users.length}}
<ul>
{{#users}}
<li>{{.}}</li>
{{/users}}
</ul>
{{/users.length}}
{{^users.length}}
<p>No Users</p>
{{/users.length}}
此处的工作示例:http://jsfiddle.net/eSvdb/
如果您希望内部语句对数组的每个元素重复,那么使用 {{#users.length}} 效果很好,但如果您只想让语句只运行一次,则可以使用:
{{#users.0}}
...
{{/users.0}}
{{^users.0}}
...
{{/users.0}}
我在 Python 中使用 chevron。由于
{{#users.length}}
是依赖于实现的,如前面的答案中所述,并且在 Chevron 中对我不起作用,因此我在代码中返回一个对象,该对象仅包含列表(如果列表非空)。想必这种技术也适用于其他语言。
users = ["user1", "user2", "userN"]
user_obj = {"user_list": users} if len(users) > 0 else {}
template = """
{{#users}}
<ul>
{{#user_list}}
<li>{{.}}</li>
{{/user_list}}
</ul>
{{/users}}
"""
chevron.render(template, {"users": user_obj})
如果您在 Python 中使用 Chevron,您可以测试第一个数组元素是否存在,以测试数组是否非空:
{{#users.0}}
<ul>
{{#users}}
<li>{{.}}</li>
{{/users}}
</ul>
{{/users.0}}