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

Итак, если у меня есть шаблон и для этого шаблона определены некоторые помощники, я могу использовать их в шаблоне как обычно, но если я попытаюсь использовать их внутри {{#each whatever}}, это выдаст мне ошибку. См. этот пример:

 {{#unless pollIsOpenHelper}}
  <p>This poll closed on {{formatDate time_poll_closed}}.</p>
{{/unless}}

<table>
  {{ #each indexedArray choices }}
    <tr>
      <td><span class="votes">{{ votes }}</span></td>
      <td><span class="text">{{ text }}</span></td>
      <td><a href="#" class="vote" data-id="{{ _index }}"><button>Vote for this option</button></a></td>
    </tr>

    {{#unless pollIsOpenHelper}}
      <p>CLOSED.</p>
    {{/unless}}

  {{ /each }}
</table>

Вышеупомянутый помощник внутри {{#unless}} работает отлично, выводит сообщение только в том случае, если опрос закрыт. Однако, если я попытаюсь сделать то же самое, чтобы отобразить сообщение внутри {{#each}} ниже, помощник не работает и всегда показывает мне сообщение. Консоль выдает мне: Exception in template helper: TypeError: Cannot read property 'poll_is_open' of undefined

РЕДАКТИРОВАТЬ: это вспомогательный код:

  Template.poll.helpers({

    pollIsOpenHelper: function() {
      var poll_is_open = Polls.findOne({_id: this._id}).poll_is_open;

      return poll_is_open;
    },

  });

person José María    schedule 28.11.2015    source источник
comment
изменения контекста внутри #each . Точный ответ не может быть дан без вспомогательного кода.   -  person David Weldon    schedule 29.11.2015
comment
Я добавил вспомогательный код   -  person José María    schedule 29.11.2015


Ответы (2)


Ваша проблема вызвана изменением контекста данных внутри вашего цикла each, как заявляли другие. Из-за чего this._id оказывается чем-то другим, чем вы ожидаете.

Предполагая, что вы используете версию Meteor 1.2.x+, вы можете обойти эту проблему с помощью нового {{#each thing in iterable}} конструкция пробелов, которая не переопределяет контекст данных.

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

{{#each array in indexedArray choices}} 
  //doStuff
{{/each}}

Если вы не используете версию Meteor 1.2.x+, вы можете изменить свой помощник, чтобы он принимал параметр, как показано ниже:

Template.poll.helpers({
  pollIsOpenHelper: function(poll) {
    var poll_is_open = Polls.findOne({_id: poll._id}).poll_is_open;
    return poll_is_open;
  },
});

Что будет вызываться в вашем шаблоне как: {{#unless pollIsOpenHelper this}} за пределами вашего блока #each или {{#unless pollIsOpenHelper ../}} внутри вашего #each block

person challett    schedule 28.11.2015

Вы можете вызвать Template.instance() изнутри каждого, чтобы получить свой экземпляр и помощники.

person Erez Hochman    schedule 28.11.2015
comment
Не могли бы вы объяснить немного больше? - person José María; 29.11.2015