2015-12-13 3 views
3

Возможно ли в Handlebars проверить, равна ли строка другому значению без регистрации помощника? Кажется, я не могу найти что-либо относящееся к этому в ссылке Handlebars.Handlebarsjs проверяет, соответствует ли строка значению

Например:

{{#if sampleString == "This is a string"}} 
...do something 
{{/if}} 

ответ

6

Кажется, вы не можете сделать это "напрямую" использование помощника

Try, почему нет?

Регистрация помощником в яваскрипта код:

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}} 

Подробнее здесь: Logical operator in a handlebars.js {{#if}} conditional

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}} 
1

Просто пришел на этот пост от Google поиск по как проверить, равна ли строка другой строке.

Я использую HandlebarsJS на стороне сервера NodeJS, но я также использую те же файлы шаблонов в интерфейсе, используя версию браузера HandlebarsJS для его синтаксического анализа. Это означало, что если бы мне нужен пользовательский помощник, я должен был бы определить его в двух отдельных местах или назначить функцию рассматриваемому объекту - слишком много усилий!

Что люди забывают, что некоторые объекты наследуют функции, которые можно использовать в шаблоне усов. В случае строки:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match

An Array containing the entire match result and any parentheses-captured matched results; null if there were no matches.

Мы можем использовать этот метод, чтобы вернуть либо массив совпадений, или null, если не было найдено ни одного совпадения. Это идеальный вариант, потому что, глядя на документацию HandlebarsJS http://handlebarsjs.com/builtin_helpers.html

You can use the if helper to conditionally render a block. If its argument returns false, undefined, null, "", 0, or [], Handlebars will not render the block.

Итак ...

{{#if your_string.match "what_youre_looking_for"}} 
String found :) 
{{else}} 
No match found :(
{{/if}} 

UPDATE:

После тестирования на всех браузерах, это не работайте над Firefox. HandlebarsJS передает другие аргументы вызову функции, что означает, что при вызове String.prototype.match второй аргумент (т.флаги Regexp для вызова функции соответствия в соответствии с приведенной выше документацией), по-видимому, передается. Firefox считает это устаревшим использованием String.prototype.match, и поэтому он прерывается.

Обойти это объявить новый функциональный прототип объекта Строка 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}} 
+0

Отлично, спасибо за это! – colmulhall

2

предыдущий ответ с матча не работает для меня, я получаю ошибка в , если оператор (что-то вроде «должен иметь только один аргумент»).

Однако, я нашел решение here без необходимости писать больше помощника:

{{#if (eq person "John")}} hello {{/if}} 
+0

Но я считаю, что для «eq» для работы вам понадобится аддон Ember Truth Helper, как указано [здесь] (https://stackoverflow.com/a/29101000/1548894). В моем случае у меня нет этого аддона. – zed

0

Mandrill почтовой службу поддерживает Рули и здесь можно использовать «кавычку», чтобы оценить логическое выражение в #if block:

{{#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}} 

Я не знаю, возможно ли это вообще, но вы должны попробовать. Он отлично работает для меня.

+0

Это вообще не работает.Ручки barfs на обратной стороне. Ну что ж. – trysis

+0

Это полезно знать. Лично я только пробовал это на Mandrill, где он отлично работает. –

1

Рулевые манипуляторы имеют условный оператор, называемый «равным», который принимает два параметра. Переменная и то, что вы проверяете, содержит ли переменная.

Для примера, чтобы проверить, «статус» содержит «Full Time»:

{{#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}} 
0

Общий случай для простого, повторного использования вспомогательной функции является причиной возврата string1, если значения равны и string2, если они не являются.

Пример:

Helper (назовем его "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 }} помощник используется для вставки «выбрано» для <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> 
Смежные вопросы