2015-11-28 5 views
2

Итак, если у меня есть шаблон, и у меня есть некоторые помощники, определенные для этого шаблона, я могу использовать их как правило в шаблоне, но если я попытаюсь использовать их внутри {{#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

EDIT: Это вспомогательный код:

Template.poll.helpers({ 

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

     return poll_is_open; 
    }, 

    }); 
+1

[con текстовые изменения] (https://www.discovermeteor.com/blog/a-guide-to-meteor-templates-data-contexts/) внутри '# each'. Точный ответ не может быть задан без вспомогательного кода. –

+0

Я добавил вспомогательный код –

ответ

0

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

+0

Не могли бы вы объяснить немного больше? –

+0

http://docs.meteor.com/#/full/template_inst –

2

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

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

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

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

Если вы не на версии Метеор 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

Смежные вопросы