车把js自定义助手为否则如果

Hec*_*ssa 20 handlebars.js

我已经开始使用Handlebars.js了.似乎没有像其他内置的条件.我希望有这样的东西

{{#if type.one }}
     do something ... IF
{{else if type.two}}
     do something ... ELSE IF
{{else}}
     do something ... ELSE
{{/if}}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.如何使用把手进行ELSE IF?写自定义助手是唯一的选择吗?如果是,那么请提供一些指导来编写这个帮助器.

mu *_*ort 21

您不能使用自定义帮助器作为Handlebars if-ish帮助程序只能理解两个部分:"if"部分和"else"部分.你可以嵌套东西:

{{#if type.one}}
    do something ... IF
{{else}}
    {{#if type.two}}
        do something ... ELSE IF
    {{else}}
        {{#if type.three}}
            ...
        {{else}}
            ...
        {{/if}}
    {{/if}}
{{/if}}
Run Code Online (Sandbox Code Playgroud)

这样的事情会变得很快,所以你可能不想这样做.更好的方法是(像往常一样把手)是逻辑推到你的JavaScript,这样最多一个type.one,type.two,type.three,...将是真实的; 然后你可以:

{{#if type.one}}
    ...
{{/if}}
{{#if type.two}}
    ...
{{/if}}
{{#if type.three}}
    ...
{{/if}}
Run Code Online (Sandbox Code Playgroud)

如果您有很多选项,type或者您的{{#if}}s中的实体很复杂,您可以切换到partials.您必须添加一个自定义帮助程序来构建基于模板变量的部分名称; 这样的事情:

Handlebars.registerHelper('show_type', function(type) {
    var types = ['one', 'two', 'three'];
    var partial;
    for(var i = 0; i < types.length; ++i) {
        if(!type[types[i]])
            continue;
        partial = '_partial_' + types[i];
        break;
    }
    if(partial)
        return Handlebars.partials[name](this);
    else
        return '';
});
Run Code Online (Sandbox Code Playgroud)

然后,假设您的部分人都已注册并且一致命名,您可以说:

{{show_type type}}
Run Code Online (Sandbox Code Playgroud)


Jac*_*gen 10

从Handlebars 3.0开始,OP描述的语法开箱即用!有关更多信息,请参阅:https://github.com/wycats/handlebars.js/pull/892.

注意:对于Ember,从版本1.10开始,这也可以.另见:http: //emberjs.com/blog/2015/02/07/ember-1-10-0-released.html#toc_chained-else-blocks