把手If-Else If-Else With String Equality Function

时间:2017-12-06 19:03:07

标签: templates handlebars.js handlebarshelper

HandlebarsJS不支持字符串相等('==')所以我必须编写自己的帮助器,但这个答案并不清楚:

https://stackoverflow.com/a/15095019/1005607

Handlebars.registerHelper('if_eq', function(a, b, opts) {
    if(a == b) // Or === depending on your needs
        return opts.fn(this);
    else
        return opts.inverse(this);
});

然后调整模板:

{{#if_eq this "some message"}}
    ...
{{else}}
    ...
{{/if_eq}}

1)他为什么要{{#if_eq ..}}而不是{{#if if_eq .. }}

2)我还需要做 ELSE-IF ,这是自Handlebars 3.0.0(我有4.0)以来支持的。但是使用他的符号,我无法做{{#elseif_eq}}没有这样的表达。如何使用此自定义帮助程序实现ELSE-IF?

1 个答案:

答案 0 :(得分:3)

示例中的帮助程序是块帮助程序。帮助器恰当地命名为if_eq,因为它需要两个表达式,如果这些表达式相等,它将呈现块中的内容。如果表达式相等,return opts.inverse(this);行将完成呈现else块的工作(参见:http://handlebarsjs.com/block_helpers.html#conditionals)。

如果您希望能够在模板中链接else if条件,则无法使用自定义块助手。相反,您必须使用常规(非阻止)Handlebars helper。块助手将呈现模板块,而常规助手将返回一个值。在您的情况下,我们将返回一个布尔值,指示所有参数是否相等。这样的助手可能如下所示:

Handlebars.registerHelper('eq', function () {
    const args = Array.prototype.slice.call(arguments, 0, -1);
    return args.every(function (expression) {
        return args[0] === expression;
    });
});

您可以通过以下方式在模板中使用此帮助程序:

{{#if (eq val1 val2)}}
    <p>IF Branch</p>
{{else if (eq val2 val3)}}
    <p>ELSE IF Branch</p>
{{else}}
    <p>ELSE Branch</p>
{{/if}}

请注意代码(eq val1 val2)中的括号。这些括号是必需的,因为我们的eq评估是#if表达式中的subexpression。括号告诉Handlebars将相等性检查的结果传递给#if块帮助器。

我创建了一个JS Fiddle供您参考。

<强>更新

上述文字指出您无法使用else if链接阻止帮助程序。这是误导。事实上,if 本身就是一个块帮助器,可以使用if关键字将任意多个else块链接在一起。甚至可以用这种方式链接不同的块助手。

解决海报第一个问题的重要一点是,两个封锁助手不能在同一个小胡子中使用。也就是说,如果{{#if if_eq ... }}是块助手,则if_eq无效。但是,使用if_eq完全有效,如下所示:

{{#if_eq this 'some message'}}
    <p>If branch.</p>
{{else if_eq this 'some other message'}}
    <p>Else if branch.</p>
{{else}}
    <p>Else branch.</p>
{{/if}}

请参阅此fiddle以获取示例。