2016-05-16 1 views
1

Я хочу дать пользователям кнопку, чтобы добавить идентификатор документа из одной коллекции (вместе с их именем группы) в другую коллекцию.Метеор, если помощник - как получить доступ к этим данным в каждом цикле

У меня есть цикл #each, который возвращает каждый документ из первой коллекции с помощью вспомогательного запроса шаблона. Внутри каждого возвращаемого документа мне нужно проверить, был ли идентификатор добавлен в другую коллекцию, и в зависимости от результата помощник #if в html возвращает другой вывод.

Но «это» возвращает пустой объект, и я не знаю, как пройти каждый «этот» контекст данных в «inCollectionTwo» помощника:

<template name="Collections"> 
    {{#each doc in colOne}} 
    {{#if inCollection2}} 
     {{> rmvfrmcolTwo doc=doc}} 
    {{else}} 
     {{> addtocolTwo doc=doc}} 
    {{/if}} 
    {{/each} 
</template> 

Помощники

Template.Collections.helpers({ 
    colOne: function() { 
    return CollectionOne.find(); 
    }, 

    inCollectionTwo: function(){ 
    var docid = this.colOne._id; 
    var group = Meteor.user().profile.groupName; 
    var exists = CollectionTwo.findOne({documentid: docid, groups: { "$in": [group]}}); 
    if(exists) { 
     return true; 
    } else { 
     return false; 
    } 
    } 
}); 

ответ

1

Поскольку вы используете each..in, вы меняете весь контекст данных этого блока на документ для каждой итерации. В этот документ теперь можно ссылаться на ключевое слово this в обработчиках событий и помощниках.

{{#each doc in colOne}} 
    {{#if inCollectionTwo)}} 
    {{> rmvfrmcolTwo doc=doc}} 
    {{else}} 
    {{> addtocolTwo doc=doc}} 
    {{/if}} 
{{/each}} 

И в вашем помощнике:

Template.Collections.helpers({ 
    //... 
    inCollectionTwo: function() { 
    // `this` is the `doc` from the #each block in your template 
    var docid = this._id; 

    //... 
    } 
} 

Edit: Или вы могли бы пройти в новом контексте помощнику в качестве параметра

{{#each doc in colOne}} 
    {{#if (inCollectionTwo doc)}} 
    ... 

И в вашем помощнике

inCollectionTwo: function(doc) { 
    var docid = doc._id; 
    //... 
} 

Руководство метеорита имеет detailed section here о Blaze и петле each..in. Есть еще несколько способов, которыми вы могли бы рассуждать о своей проблеме, но это должно заставить вас начать.

+0

спасибо за вход @chazsolo, на первом примечании, это была просто оговорка транспонирования с моей стороны. Я просто переименовал шаблон, помощники и коллекции для удобства чтения здесь. Но по вашему второму пункту, «это» само по себе все еще возвращает пустой объект. Я пробовал это до публикации и должен был упомянуть. – edoras

+0

@edoras вы также можете попробовать перейти в «doc» к помощнику в качестве параметра, а затем получить доступ к нему. Например: '{{#if (inCollectionTwo doc)}}' - я обновил свой ответ, чтобы отразить это – chazsolo

+0

еще раз спасибо @chazsolo, прохождение в доке сделало трюк! – edoras

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