0

以下は、論理 AND/OR 複数引数の Handlebars.JS ヘルパーとして提案されました。

Handlebars.registerHelper({
    and: function () {
        return Array.prototype.slice.call(arguments).every(Boolean);
    },
    or: function () {
        return Array.prototype.slice.call(arguments).some(Boolean);
    }
});

Handlebars.js Else If

私はそれを次のように呼び出す必要があるため、これは私にとってはうまくいきません

{{#if (or questionType 'STARTTIME' 'ENDTIME') }}

{{#if (or questionType 'STARTTIME' 'ENDTIME' 'ARGUMENT3' 'ARGUMENT4') }}

言い換えると、

  1. AND/OR に対して複数の引数をサポートしています。
  2. 最初の引数は常に私がチェックしているものです

    return (questionType == arg1 || questionType == arg2 || questionType == arg3 ...)

言い換えれば、私は愚かな 2-param or(..) / and(..) をこのように書くことはできません。

Handlebars.registerHelper('or', function(a, b, c) {
    if(a == b || a == c)
        return true;
    else
        return false;
});

最初の引数が常にチェックされている複数の引数である必要があります。何かご意見は?

4

1 に答える 1

1

最初: 元のorヘルパーは機能しません。Handlebars は、ヘルパーを呼び出すときに、追加のメタ オブジェクトを最終引数として渡します。たとえばor、テンプレートでヘルパーを使用すると、次のオブジェクト(or false false)でヘルパー関数が実行されます。arguments

{
    0: false,
    1: false,
    2: {
        "name": "or",
        "hash": {...},
        "data": {...}
    },
    length: 3
}

でのそのオブジェクトの存在は、変換で3評価され、呼び出しサイトが値のみを渡すにもかかわらず、ヘルパーが返されます。trueBooleantruefalse

ヘルパーを意図したとおりに機能させるには、オブジェクトをスライスするときに最後の引数を除外する必要がありargumentsます。(FYI: の目的はslice、配列のようなオブジェクトを配列に変換しargumentsて、 のように Array.prototype メソッドを呼び出すことができるようにすること.someです。) これを行うには、orヘルパーを次のように更新します。

return Array.prototype.slice.call(arguments, 0, -1).some(Boolean);

ここで、最初の引数の式を残りの式と比較する問題に取り掛かります。.slice同様に、最初の引数も除外するように呼び出しを更新できます.slice.call(arguments, 1, -1)。次に、スライス内の各項目を最初の引数と比較するだけです。ヘルパーは次のようになります。

return Array.prototype.slice.call(arguments, 1, -1).some(arg => arg === arguments[0]);

ヘルパーは意図したとおりに機能するようになりました。ただし、「or」演算ではなく「in」演算として名前を変更することを強くお勧めします。

于 2018-05-05T19:24:51.223 に答える