车把 If-Else If-Else 与字符串相等函数

gen*_* b. 3 templates handlebars.js handlebarshelper

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

/sf/answers/1056651361/

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);
});
Run Code Online (Sandbox Code Playgroud)

然后调整您的模板:

{{#if_eq this "some message"}}
    ...
{{else}}
    ...
{{/if_eq}}
Run Code Online (Sandbox Code Playgroud)

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

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

764*_*484 9

您示例中的助手是块助手。这个助手的名字很恰当,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;
    });
});
Run Code Online (Sandbox Code Playgroud)

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

{{#if (eq val1 val2)}}
    <p>IF Branch</p>
{{else if (eq val2 val3)}}
    <p>ELSE IF Branch</p>
{{else}}
    <p>ELSE Branch</p>
{{/if}}
Run Code Online (Sandbox Code Playgroud)

请注意代码中的括号(eq val1 val2)。这些括号是必需的,因为我们的eq评估是表达式中的#if表达式。括号告诉 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_eq}}
Run Code Online (Sandbox Code Playgroud)

请参阅此小提琴示例。