Логический OR / AND Handlebars.JS Helper, несколько аргументов, первый всегда проверяется - PullRequest
0 голосов
/ 05 мая 2018

Следующее было предложено в качестве логического помощника AND / OR Multi-arg 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 Иначе, если

Это не работает для меня, потому что мне нужно назвать это как

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

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

Другими словами,

  1. Я поддерживаю несколько аргументов для моего И / ИЛИ,
  2. T первый аргумент - это всегда то, что я проверяю , например,

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

Другими словами, я не могу написать тупой 2-параметр или (..) / и (..) как этот,

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

Это должен быть мульти-аргумент, причем первый всегда проверяется. Есть мысли?

1 Ответ

0 голосов
/ 05 мая 2018

Первый: ваш оригинальный or помощник не будет работать. Handlebars передает дополнительный мета-объект в качестве последнего аргумента при вызове помощника. Например, использование вашего or помощника в шаблоне в качестве (or false false) приводит к выполнению вспомогательной функции со следующим объектом arguments:

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

Наличие этого объекта в 3 оценивается как true в преобразовании Boolean и заставит вашего помощника вернуть true, несмотря на то, что сайт вызова передает только false значения.

Чтобы помощник работал должным образом, нам нужно исключить последний аргумент, когда нарезает наш arguments объект. (К сведению: цель 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]);

Наш помощник теперь работает так, как нам нужно; но я призываю вас переименовать его, поскольку это не операция «или», а «in».

...