在无逻辑胡子模板引擎中实现条件

时间:2012-12-06 09:02:35

标签: jquery templates conditional-statements mustache

到目前为止,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-plugin)集成是一个优势,但不是必需的 - 我可以自己完成。

感谢。

1 个答案:

答案 0 :(得分:3)

总有Handlebars比香草胡子(它是胡子的超集)更富有功能,当然你也可以使用任何其他可用于JS的无数模板引擎。如果你使用Handlebars,你甚至可以重新实现一个接受多个参数的{{#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}))

请注意,这可以被纯粹主义者视为“作弊”,因为您正在实施某种复合逻辑运算符,甚至更多地使其接受不确定数量的参数。 Mustache的观点是拥有一个非常小的spec,可以轻松移植到编程语言中,以便您可以在后端和前端交替重用模板。