处理mustache.js中的空列表

时间:2012-01-05 16:15:01

标签: javascript list template-engine mustache

我正在使用mustache.js在javascript中渲染模板。我想在下面的示例中检查列表是否为空以隐藏<h2>标记。这是可能的还是mustache.js太逻辑了?

这是模板:

<h2>Persons:</h2>
<ul>
  {{#persons}}
    {{name}}
  {{/persons}}
</ul>

这是数据:

{
  "persons":[
    {"name": "max"},
    {"name": "tom"}
  ]
}

5 个答案:

答案 0 :(得分:41)

你可以使用persons.length。如果它是一个真值(即大于0),则将呈现该块。

{{#persons.length}}
<h2>Persons:</h2>
<ul>
  {{#persons}}
    <li>{{name}}</li>
  {{/persons}}
</ul>
{{/persons.length}}

答案 1 :(得分:35)

在遇到这个问题困扰了半天之后,我终于找到了一个简单的解决方案!

请勿检查列表,但检查其第一项是否为空!

模板:

{{#persons.0}}
<h2>Persons:</h2>
<ul>
  {{#persons}}
    <li>{{name}}</li>
  {{/persons}}
</ul>
{{/persons.0}}
{{^persons.0}}No persons{{/persons.0}}

数据:

{
  "persons":[
    {"name": "max"},
    {"name": "tom"}
  ]
}

输出:

<h2>Persons:</h2>
<ul>
  <li>max</li>
  <li>tom</li>
</ul>

数据:

{
  "persons": []
}

输出:

"No Persons"

答案 2 :(得分:29)

为了保持模板的逻辑性,您可以在渲染模板之前进行此检查:

// assuming you get the JSON converted into an object
var data = {
    persons: [
        {name: "max"}
      , {name: "tom"}
    ]
};
data.hasPersons = (data.persons.length > 0);

然后您的模板将如下所示:

<h2>Persons:</h2>
{{#hasPersons}}
<ul>
  {{#persons}}
    <li>{{name}}</li>
  {{/persons}}
</ul>
{{/hasPersons}}

答案 3 :(得分:6)

请改用handlebars。它是Mustache的超集,可以为您提供所需的更多功能。小胡子社区要求这个功能,但维护者refuses to put it in

答案 4 :(得分:4)

在javascript中,您可以查看{{#names.length}}{{/names.length}}{{#names.0}}

如果你不在javascript之外(例如在pystache或Scalate中),那你就不走运了。唯一的解决方案是引入一个单独的布尔值,或者将数组嵌套在一个对象中,如果你有一个空数组,就像你建议的maxbeatty一样,你可以完全避免它。