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

Handlebars.js с использованием../для ссылки на родительский контекст

Предположим, что у меня есть следующий шаблон JSON и handlebars.js:

JSON

{ 
  rootPath: '/some/path/',
  items:[ {
    title: 'Hello World',
    href: 'hello-world'
  },  {
    title: 'About',
    href: 'about'
  },  {
    title: 'Latest News',
    href: 'latest-news'
  }
}

Шаблон

<script id="test-template" type="text/x-handlebars-template">

  <ul class="nav">
    {{#each items}}
      <li><a href="{{../rootPath}}{{href}}">{{title}}</a></li>
    {{/each}}
  </ul>

</script>

Шаблон выше работает, пока я не хочу фильтровать элементы - скажем, чтобы иметь 2 списка один нечетный, а другой - даже простой шаблон для нечетного:

<script id="test-template" type="text/x-handlebars-template">

  <ul class="nav">
    {{#each items}}
      {{#isOdd @index}}
        <li><a href="{{../rootPath}}{{href}}">{{title}}</a></li>
      {{/isOdd}}
    {{/each}}
  </ul>

</script>

И зарегистрированный помощник:

// isOdd, helper to identify Odd items
Handlebars.registerHelper('isOdd', function (rawValue, options) {
  if (+rawValue % 2) {
    return options.fn(this);
  } else {
    return options.inverse(this);
  }
});

Помощники работают, как ожидалось, и выводятся только нечетные элементы, однако ссылка на родительский контекст теряется, поэтому директива {{../rootPath}} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Есть ли способ передать родительский контекст через вспомогательный блок?

4b9b3361

Ответ 1

Изменить

<a href="{{../rootPath}}{{href}}"> to this:
<a href="{{../../rootPath}}{{href}}">

Почему? потому что оператор if находится во внутреннем контексте, поэтому сначала вам нужно подняться на уровень и что вы должны добавить.. /

Подробнее см.: https://github.com/wycats/handlebars.js/issues/196