Подтвердить что ты не робот

Вызов помощника в случае блокировки в ручном шаблоне

Я работаю с движком шаблонов Handlebars.js и пытаюсь найти способ сделать что-то вроде этого (надуманный пример):

{{#if itemSelected "SomeItem"}}
    <div>This was selected</div>
{{/if}

где itemSelected является зарегистрированным помощником, подобным этому:

Handlebars.registerHelper("itemSelected", function(item) {
    var selected = false;
    // Lots of logic that determines if item is selected
    return selected;
});

Я получаю ошибки при попытке использовать этот синтаксис для шаблона, и я не могу найти ни одного примера, демонстрирующего подобные вещи. Я вижу простые блоки #if, подобные этому...

{{#if myValueInContext}}
    <div>This will show if myValueInContext results in a truthy value.</div>
{{/if}}

Но я не могу понять, как решить первый пример. Возможно, я приближаюсь к этому неправильно.

Кстати, я пометил это Усы, поскольку я не мог добавить тег Handlebars к вопросу.

4b9b3361

Ответ 1

Я не думаю, что это сработает. Если я правильно понимаю документацию по рулям, #if является зарегистрированным блочным помощником и не принимает другого зарегистрированного помощника в качестве аргумента.

В соответствии с документацией вы можете реализовать это как


Handlebars.registerHelper('ifItemSelected', function(item, block) {
  var selected = false;
  // lots of logic that determines if item is selected

  if(selected) {
    return block(this);
  }
});

После этого вы сможете называть его


{{#ifItemSelected SomeItem}}
    This was selected
{{/ifItemSelected}

но вы должны убедиться, что SomeItem имеет правильный формат. Я не вижу способа использовать зарегистрированный обработчик как условный в if-statement.

Ответ 2

Вы должны добавить круглые скобки вокруг встроенного вспомогательного вызова:

{{#if (itemSelected "SomeItem")}}
    <div>This was selected</div>
{{/if}

Я экспериментировал и проверял, что он просто работает.

Не уверен, что он упоминается в документации Handlebars. Я узнал трюк из примеров handlebars-layouts.

Ответ 3

С последней версией (1.0.rc.1) Handlebars вам нужно написать sth как:

Handlebars.registerHelper('ifItemSelected', function(item, options) {
  var selected = false;
  // lots of logic that determines if item is selected

  if (selected) {
    return options.fn(this);
  }
});

т. block (this) заменяется на options.fn(this)

http://handlebarsjs.com/block_helpers.html#conditionals

Ответ 4

Если вы хотите иметь еще одну опцию, вам понадобится этот код:

Handlebars.registerHelper('ifItemSelected', function(item, options) {
  var selected = false;
  // lots of logic that determines if item is selected

  if (selected) {
    return options.fn(this);
  }
  else {
   return options.inverse(this);
 }
});

Используется с:

{{#ifItemSelected SomeItem}}
    This was selected
{{else}}
    This was not selected
{{/ifItemSelected}