Возможно ли в Handlebars проверить, равна ли строка другому значению без регистрации помощника? Кажется, я не могу найти что-либо относящееся к этому в ссылке Handlebars.
Например:
{{#if sampleString == "This is a string"}}
...do something
{{/if}}
Возможно ли в Handlebars проверить, равна ли строка другому значению без регистрации помощника? Кажется, я не могу найти что-либо относящееся к этому в ссылке Handlebars.
Например:
{{#if sampleString == "This is a string"}}
...do something
{{/if}}
Кажется, вы не можете сделать это "напрямую",
Попробуйте использовать помощника, почему бы и нет?
Зарегистрируйте помощник в вашем javascript-коде:
Handlebars.registerHelper('ifEquals', function(arg1, arg2, options) {
return (arg1 == arg2) ? options.fn(this) : options.inverse(this);
});
Использовать в шаблоне:
{{#ifEquals sampleString "This is a string"}}
Your HTML here
{{/ifEquals}}
Подробнее здесь: Логический оператор в handlebars.js {{#if}} условный
UPD: Другой способ:
допустим, ваши данные:
var data = {
sampleString: 'This is a string'
};
Затем (используя jQuery):
$.extend(data, {isSampleString: function() {
return this.sampleString == 'This is a string';}
});
Шаблон использования:
{{#if isSampleString}}
Your HTML here
{{/if}}
Я бы просто использовал помощников:
Handlebars.registerHelper('ifeq', function (a, b, options) {
if (a == b) { return options.fn(this); }
return options.inverse(this);
});
Handlebars.registerHelper('ifnoteq', function (a, b, options) {
if (a != b) { return options.fn(this); }
return options.inverse(this);
});
Затем в вашем коде:
{{#ifeq variable "string"}}
... do this ...
{{/ifeq}}
{{#ifnoteq variable "string"}}
... do this ...
{{/ifnoteq}}
Только что пришел к этому сообщению из поиска Google о том, как проверить, равна ли строка другой строке.
Я использую HandlebarsJS в NodeJS на стороне сервера, но я также использую те же файлы шаблонов на внешнем интерфейсе, используя версию HandlebarsJS для браузера для его анализа. Это означало, что если бы мне нужен пользовательский помощник, мне пришлось бы определять его в двух разных местах или назначать функцию для рассматриваемого объекта - слишком много усилий !!
Люди забывают, что некоторые объекты имеют наследуемые функции, которые можно использовать в шаблоне усов. В случае строки:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match
Массив, содержащий весь результат совпадения и все сопоставленные результаты, полученные в скобках; ноль, если не было совпадений.
Мы можем использовать этот метод для возврата либо массива совпадений, либо null
если совпадений не найдено. Это прекрасно, потому что, глядя на документацию HandlebarsJS http://handlebarsjs.com/builtin_helpers.html
Вы можете использовать помощник if для условного рендеринга блока. Если его аргумент возвращает false, undefined, null, "", 0 или [], Handlebars не будут визуализировать блок.
Так...
{{#if your_string.match "what_youre_looking_for"}}
String found :)
{{else}}
No match found :(
{{/if}}
ОБНОВИТЬ:
После тестирования во всех браузерах это не работает в Firefox. HandlebarsJS передает другие аргументы в вызов функции, что означает, что при вызове String.prototype.match второй аргумент (т.е. Флаги Regexp для вызова функции match в соответствии с приведенной выше документацией), по-видимому, передается. Firefox рассматривает это как устаревшее использование String.prototype.match и поэтому ломает.
Обходной путь - объявить новый функциональный прототип для объекта String JS и использовать его вместо этого:
if(typeof String.includes !== 'function') {
String.prototype.includes = function(str) {
if(!(str instanceof RegExp))
str = new RegExp((str+'').escapeRegExp(),'g');
return str.test(this);
}
}
Убедитесь, что этот код JS включен, прежде чем запускать функцию Handlebars.compile(), а затем в шаблон...
{{#your_string}}
{{#if (includes "what_youre_looking_for")}}
String found :)
{{else}}
No match found :(
{{/if}}
{{/your_string}}
Предыдущий ответ с совпадением не работает для меня, я получаю сообщение об ошибке в выражении if (что-то вроде "должен иметь только один аргумент").
Тем не менее, я просто нашел решение здесь, не имея необходимости писать больше помощника:
{{#if (eq person "John")}} hello {{/if}}
Вы не можете напрямую сравнивать строки в рулях, и вам нужно использовать помощника. Я попробовал вышеуказанные решения с моим приложением Koa и не смог зарегистрировать помощника. Следующий код работал для меня, и я думаю, что это должно работать и для экспресс-приложений. Я надеюсь, что это помогает кому-то.
Код в server.js
var handlebars = require('koa-handlebars');
const isEqualHelperHandlerbar = function(a, b, opts) {
if (a == b) {
return opts.fn(this)
} else {
return opts.inverse(this)
}
}
app.use(handlebars({
viewsDir: './app/views',
layoutsDir: './app/views/layouts',
defaultLayout: 'main',
helpers : {
if_equal : isEqualHelperHandlerbar
}
}));
Node.js добавить это в server.js
const isEqual = function(a, b, opts) {
if (a == b) {
return opts.fn(this)
} else {
return opts.inverse(this)
}
}
var hbs = require('hbs');
hbs.registerHelper('if_eq', isEqual);
Используйте handlebars-helpers, которые предоставляет eq
helper
Обычный случай для простой, повторно используемой вспомогательной функции - вызвать возврат строки1, если значения равны, и string2, если они не являются.
Пример:
Помощник (позвольте называть его "ifEqual" и отправить 4 параметра):
helpers: {
ifEqual: function (obj, value, trueString, falseString) {
return ( (obj===value) ? trueString : falseString );
}
Использование шаблона:
В этом примере предположим, что шаблон получает объект транзакции с свойством "transactionType": { transactionType: "expense", description: "Copies" }
Скажем, наш шаблон имеет <select>
для типа транзакции с различными <option>s
как показано. Мы хотим использовать Handlebars для предварительного выбора опции, которая совпадает со значением transactionType.
Наш новый помощник {{ ifEqual }}
используется для вставки "selected" для <option>
с соответствующим значением "расход".
<select required id="selTransactionType" name="selTransactionType" class="form-control" onchange='transactionTypeChanged()'>
<option value='hourly' {{ ifEqual transaction.transactionType "hourly" "selected" "" }} >Hourly fee</option>
<option value='flat' {{ ifEqual transaction.transactionType "flat" "selected" "" }} >Flat fee</option>
<option value='expense' {{ ifEqual transaction.transactionType "expense" "selected" "" }} >Expense</option>
<option value='payment' {{ ifEqual transaction.transactionType "payment" "selected" "" }} >Payment</option>
<option value='credit' {{ ifEqual transaction.transactionType "credit" "selected" "" }} >Credit</option>
<option value='debit' {{ ifEqual transaction.transactionType "debit" "selected" "" }} >Debit</option>
</select>
В Handlebars круглые скобки используются для вызова первого элемента, перечисленного как функция, с использованием (необязательно) последующих элементов в качестве параметров. Таким образом, синтаксис из Ember МОЖЕТ использоваться без Ember, при условии, что вы можете установить контекст самостоятельно. Например:
context.eq = function(param1, param2) {
return param1 === param2;
}
context.notEq = function(param1, param2) {
return param1 !== param2;
}
Сделав это, вы можете использовать стандартные {{#if}} и {{#unless}} блочные операции:
{{#if (eq someVar "someValue") }}
Будьте осторожны при переключении контекстов с помощью {{with}} или при использовании встроенных партиалов. Вы можете потерять отслеживание вашей определенной функции "eq". Гарантированный способ работы вне зависимости от новых условий:
{{#if (@root.eq someVar "someValue") }}
Пытаться:
{{#is item.status "complete"}}... {{/is}}
У меня были те же трудности, что и у OP, и я решил просто сдать вызов Javascript вместо того, чтобы сгибать руль под мою волю...
Функция Javascript (в глобальном масштабе) -
function jsIfElse(compare1, compare2, trueResponse, falseResponse) {
document.write((compare1 == compare2) ? trueResponse : falseResponse);
}
Фрагмент руля -
<select multiple id="batter_player_team">
{{#each teamNamesForFilter}}
<option value="{{this.id}}"> <script>jsIfElse('{{this.is_active}}','Y','{{this.name}} *', '{{this.name}}');</script>
</option>
{{/each}}
</select>
Почтовая служба Mandrill поддерживает Handlebars, и здесь можно использовать "backticks" для оценки логического выражения в блоке #if:
{{#if 'operating_system == "OS X"'}}
<p>Click here for instructions to install on a Mac</p>
{{elseif 'operating_system == "Windows"'}}
<p>Click here for instructions to install on a PC</p>
{{/if}}
Я не знаю, возможно ли это вообще, но вы должны попробовать. Он отлично работает для меня.
У ручек есть условный оператор, называемый "равным", который принимает два параметра:
1. Переменная
2.Что вы проверяете, содержит ли переменная.
Например, чтобы проверить, содержит ли статус "Полное время":
{{#equal status "Full Time"}} //status is the variable and Full Time is the value your checking for.
code to be executed
{{else}}
code to be executed
{{/equal}}