处理mustache.js中的空列表

Max*_*idt 28 javascript template-engine list mustache

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

这是模板:

<h2>Persons:</h2>
<ul>
  {{#persons}}
    {{name}}
  {{/persons}}
</ul>
Run Code Online (Sandbox Code Playgroud)

这是数据:

{
  "persons":[
    {"name": "max"},
    {"name": "tom"}
  ]
}
Run Code Online (Sandbox Code Playgroud)

Qaz*_*ian 42

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

{{#persons.length}}
<h2>Persons:</h2>
<ul>
  {{#persons}}
    <li>{{name}}</li>
  {{/persons}}
</ul>
{{/persons.length}}
Run Code Online (Sandbox Code Playgroud)

  • 对于mustache.java,您可以使用`{{^ people.isEmpty}}` (6认同)
  • 如果您正在渲染服务器端(在javascript之外),这不起作用 (5认同)
  • @iwein:问题*毕竟被标记为`javascript`,它也可以在节点中运行:) @Qazzian:+1,一种避免小胡子lambdas的简洁方法! (2认同)
  • @ov我给了这个答案一个upvote,不要担心.然而,评论中的其他信息对我有帮助. (2认同)

Bou*_*egh 36

经过半天的努力解决这个问题后,我终于找到了一个简单的解决方案!

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

模板:

{{#persons.0}}
<h2>Persons:</h2>
<ul>
  {{#persons}}
    <li>{{name}}</li>
  {{/persons}}
</ul>
{{/persons.0}}
{{^persons.0}}No persons{{/persons.0}}
Run Code Online (Sandbox Code Playgroud)

数据:

{
  "persons":[
    {"name": "max"},
    {"name": "tom"}
  ]
}
Run Code Online (Sandbox Code Playgroud)

输出:

<h2>Persons:</h2>
<ul>
  <li>max</li>
  <li>tom</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

数据:

{
  "persons": []
}
Run Code Online (Sandbox Code Playgroud)

输出:

"No Persons"
Run Code Online (Sandbox Code Playgroud)


Yur*_*sov 30

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

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

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

<h2>Persons:</h2>
{{#hasPersons}}
<ul>
  {{#persons}}
    <li>{{name}}</li>
  {{/persons}}
</ul>
{{/hasPersons}}
Run Code Online (Sandbox Code Playgroud)

  • 尽管这是一个正确的答案,我认为必须使用这种方法是Mustache语法真正弱点的标志.只要前端(模板)开发人员可以访问后端(数据源)代码,它就可以了,但如果这两个代码是分开的,或者前端开发人员更像是一个HTML slinger而不是编码器,它会变得漂亮不可行的. (9认同)
  • @TimHolt好吧,我绝对明白你的观点.虽然有优势.我们假设您要对应用程序的这一部分进行单元测试.使用无逻辑的模板引擎,我只满足于对数据进行单元测试(在它被送到Mustache之前),而不必对生成的html进行字符串比较测试.现在,如果我的模板具有逻辑(甚至像检查.length> 0一样简单)我觉得需要对该逻辑进行单元测试,因此将被迫进行字符串比较或类似selenium/doh机器人.所以,这是我认为的权衡. (7认同)
  • 模板的目的是将View与模型和控制器分开.该解决方案基本上将View元信息移动到Controller中.Mustache让你做这些事情的事实违背了自己的目的.模板不应该是无逻辑的(if语句也是逻辑,因此它无论如何都不是逻辑的),但模板应包含视图逻辑而不包含应用程序逻辑. (3认同)

and*_*wrk 6

改用把手.它是Mustache的超集,为您提供所需的更多功能.小胡子社区要求这个功能,但维护者拒绝把它放进去.


iwe*_*ein 5

在javascript中,您可以通过{{#names.length}}{{/names.length}}或通过{{#names.0}}

如果您不使用javascript(例如,在pystache或Scalate中),则不走运。然后,唯一的解决方案是引入一个单独的布尔值,或者将数组嵌套在一个对象中,如果您有一个空数组,则可以完全避免,例如建议使用maxbeatty。