Вызов помощника в блоке If в шаблоне руля - PullRequest
30 голосов
/ 12 июня 2011

Я работаю с движком шаблонов 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}}

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

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

Ответы [ 4 ]

89 голосов
/ 23 июня 2015

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

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

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

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

44 голосов
/ 26 декабря 2012

В последней версии Handlebars (1.0.rc.1) вы должны написать что-то вроде:

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

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

т.е. блок (это) заменяется options.fn (это)

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

33 голосов
/ 13 июня 2011

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

5 голосов
/ 03 октября 2014

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

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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...