20

我已经开始使用 Handlebars.js。似乎没有像 else if 这样的内置条件。我想要这样的东西

{{#if type.one }}
     do something ... IF
{{else if type.two}}
     do something ... ELSE IF
{{else}}
     do something ... ELSE
{{/if}}

但这不起作用。我如何用车把做 ELSE IF?编写自定义助手是唯一的选择吗?如果是,请提供一些指示来编写此帮助程序。

4

6 回答 6

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}}

这种事情会很快变得讨厌,所以你可能不想这样做。更好的方法是(与 Handlebars 一样)将逻辑推送到您的 JavaScript 中,以便至多有一个type.one, type.two, type.three, ... 为真;那么你可以:

{{#if type.one}}
    ...
{{/if}}
{{#if type.two}}
    ...
{{/if}}
{{#if type.three}}
    ...
{{/if}}

如果您有很多选择type或者如果您{{#if}}的 s 中的主体很复杂,您可以切换到部分。但是,您必须添加一个自定义帮助程序才能基于模板变量构建部分名称;像这样的东西:

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 '';
});

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

{{show_type type}}
于 2012-10-31T19:31:40.133 回答
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

于 2015-02-19T08:25:22.073 回答
4

如果您使用类似 ember 的框架,

{{#if isAtWork}}
     Ship that code!
{{else if isReading}}
      You can finish War and Peace eventually...
{{/if}}

链接: http: //guides.emberjs.com/v1.12.0/templates/conditionals/

于 2015-06-18T13:25:02.950 回答
1

你可以这样做:

{{#if type.one}}
  ...
{{else}} {{#if type.two}}
  ...
{{else}} {{#if type.three}}
  ...
{{else}}
  ...
{{/if}}{{/if}}{{/if}}
于 2013-10-23T07:48:43.783 回答
1

如果您想要切换行为,您可能对Dan Harper 的助手感兴趣,您将能够执行以下操作:

{{#is type 1}}
    <p>Do something when 1.</p>
{{else}}{{#is type 2}}
    <p>Do something when 2.</p>
{{else}}{{#is type 3}}
    <p>Do something when 3.</p>
{{/is}}{{/is}}{{/is}}

这是jsfiddle

于 2015-05-24T15:48:23.097 回答
0

OP 编写的确切语法将在今天 ember-htmlbars-inline-if-helper启用功能标志的 Ember Canary 中工作。

于 2015-02-08T18:01:49.320 回答