Вызов помощника внутри блока If в шаблоне Handlebars

Я работаю с Handlebars.JS template engine и я пытаюсь выяснить, как сделать что-то вроде этого (надуманный пример):

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

но я не могу понять, как справиться с первым примером. Может, и так. подходить к этому неправильно.

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

4 ответов


Я не думаю, что это сработает. Если я правильно понимаю документацию по рулю, #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-операторе.


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

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

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

Не уверен, что это упоминается в документации по рулю. Я научился этому трюку на примерах руль-макетов.


С последней версии (1.0.дистанционное управление.1) руля, вы должны написать 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);
  }
});

ie. заблокировать(это) заменить на параметры.fn (this)

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


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

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}