实施条件

问题描述:

到目前为止mustache是伟大的,但逻辑少现在似乎并没有成为一个功能。假设,我必须呈现模板,其中可以包含用户的电子邮件和名称。实施条件

如果电子邮件和名字都存在我希望我的渲染结果是:

<a href="mailto:EMAIL">NAME</a> 

如果电子邮件是存在的,但没有名字,结果将是:

<a href="mailto:EMAIL">EMAIL</a> 

如果只是名称模板应呈现为:

NAME 

所以现在我必须做类似:

{{#email}}<a href="mailto:{{email}}">{{#name}}{{name}}{{/name}}{{^name}}{{email}}{{/name}}</a>{{/email}}{{^email}}{{name}}{{/email}} 

这真是太丑了!而这只是3个条件!如果我需要更多?我觉得在mustache中应该有另外一种方法。或者不应该?

所以,小胡子开发者认为是逻辑少是好事,但我有一个说法。大多数情况下,我们需要检查模板中的某个变量(大多数时候我们只需要检查是否存在)。所以我会做这样的事情:

{% if email %}{{ email }}{% else %}{{ name }}{% endif %} 

,这看起来更全面然后

{{#email}}{{email}}{{/email}}{{^email}}{{name}}{{/email}} 

不是吗?

如果我需要检查name太:

{% if email %}{{email}}{% elif name %}{{name}}{% else %}Anonymous{% endif %} 

VS

{{#email}}{{email}}{{/email}}{{^email}}{{#name}}{{name}}{{/name}}{{^name}}Anonymous{{/name}}{{/email}} 

如果没有,你会建议其他模板库中javascript渲染模板?与jQuery(jQuery插件)集成是一个优势,但不是要求 - 我可以自己做。

谢谢。

+1

请查看:http://garann.github.com/template-chooser/ –

+0

一些Mustache实现接受'{{#foo}} ... {{^ foo}} ... {{/ foo }}语法,它有点短。有些人甚至接受'{{#foo}} ... {{^}} ... {{/}}'。然而,胡子仍然是冗长的,当然。 –

总是有Handlebars这是比香草小胡子(这是胡须的超集)多一点功能,当然,您可以使用任何其他无数的JS模板引擎。如果你把手去,你甚至可以重新实现一个版本,接受多个参数,像这样的{{#if}}块帮手(警告:非常轻微的测试,写作大多是出于我的头顶部)

Handlebars.registerHelper('if', function() { 
    var args = Array.prototype.slice.call(arguments), 
     options = args.splice(-1, 1)[0], 
     allPass = true, 
     context; 

    for (var i = 0; i < args.length; i++) { 
     context = args[i]; 

     if(Object.prototype.toString.call(context) === "[object Function]") { 
      context = context.call(this); 
     } 

     if (!context || Handlebars.Utils.isEmpty(context)) { 
      allPass = false; 
      break; 
     } 
    } 

    if(allPass) { 
     return options.fn(this); 
    } else { 
     return options.inverse(this); 
    } 
}); 

,并用它像这样:

var template = "{{#if a b c}}pass{{else}}fail{{/if}}"; 
var c = Handlebars.compile(template); 
console.log(c({a: true, b: pass, c: true})) 

请注意,这可以被认为是“作弊”的纯粹主义者,你正在实现某种混合逻辑运算符,更使其接受则params的不确定量。 Mustache的要点是要有一个非常简单的spec,它可以轻松移植到各种编程语言中,以便可以在后端和前端交换重用您的模板。