2016-05-16 44 views
1

我想给用户一个按钮,将一个文档的id(连同他们的组名)添加到另一个集合中。流星如果帮手 - 如何在每个循环中访问这些数据

我有一个#each循环,通过模板助手查询从第一个集合中返回每个文档。在每个返回的文档中,我需要检查id是否已经添加到其他集合中,并且取决于结果,html中的#if助手会返回不同的输出。

但“这”是返回一个空的对象,我不知道该怎么给每个“这个”数据上下文传递到“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; 

    //... 
    } 
} 

编辑:或者,你可以在新的背景下传入到助手作为参数

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

而在你的帮手

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

流星指南有关于Blaze和each..in循环的​​。还有其他几种方式可以推断你的问题,但这应该让你开始。

+0

感谢输入@chazsolo,在第一个音符,这只是我的部分转座错字。为了便于阅读,我重新命名了模板,帮助器和集合。但就你的第二点来说,“这”本身仍然是一个空洞的对象。我在发布之前尝试过,应该提到。 – edoras

+0

@edoras你也可以尝试将'doc'作为参数传递给helper,然后在那里访问它。就像:'{{#if(inCollectionTwo doc)}}' - 我已经更新了我的回答,以反映这个 – chazsolo

+0

再次感谢@chazsolo,通过doc实现了诀窍! – edoras