2017-08-27 76 views
0

Helper方法使用阵列使用流星JS

GetSchoolId: function() { 
      var moduleIdArray=[]; 
      var myslug = FlowRouter.getParam('myslug'); 
      var mySchoolId = SchoolDb.findOne({slug: myslug}); 
      if (mySchoolId) { 
       ModuleSchool.find({}, {schoolId: mySchoolId._id}).forEach(function (modulesSelected) { 
        moduleIdArray.push(modulesSelected.moduleId); 
       }); 
       if (typeof moduleIdArray === 'object' && moduleIdArray instanceof Array) { 
        console.log(moduleIdArray); 
        moduleIdArray.forEach(function (moduleIds) { 
         return Modules.find({}, {_id: moduleIds}).fetch(); 
        }); 
       } 
      } 
     } 

模板代码找到一个集合中的文件:

{{#each GetSchoolId }} 
    <p>{{GetSchoolId.modulename}} </p> 
    {{/each}} 
    </p> 
{{/each}} 

我知道流星PROFS,它是一个冰山英寸,在几秒钟内就将被破坏。我有3个收藏,一个用于学校纪录(SchoolDb),第二个用于模块(模块),第三个是关系表(ModuleSchool)。模块被分配给学校。

从上面的代码中,我能够使用传递给我用它来从关系表(SchoolDb)的schoolId路由的蛞蝓和(ModuleSchool)返回模块得到(SchoolDb)学校_id被分配到该学校。我能够获取模块ID并将它们转换为数组,我现在要做的是使用从ModuleSchool获取的ID数组返回模块名称,因为只有_ids存储在关系表中。

上面的代码只会将_ids转换为数组的级别,当我尝试在模板上打印时没有任何显示。我错了什么?

+1

看['$ in'(https://docs.mongodb.com/manual/reference/operator/query/in/) –

+0

尼尔伦恩,谢谢。请根据我的文章在实现中提供一个片段。 – kehinde

回答

2

要对应于一个阵列的至少一个元件的区域,您可以使用$in找到文件:

Template.my_template.helpers({ 
    modules(){ 
     var myslug = FlowRouter.getParam('myslug'); 
     var mySchoolDoc = SchoolDb.findOne({slug: myslug}); 
     var arrayModuleSchool = ModuleSchool.find({schoolId: mySchoolDoc._id}); 
     // Transform the array of document into an array with only the ids 
     var arrayModuleIds = []; 
     arrayModuleSchool.forEach(function(moduleSchool)){ 
      arrayModuleIds.push(moduleSchool.moduleId); 
     }); 
     return Modules.find({_id: {$in: arrayModuleIds}}).fetch(); 
    } 
}); 

,然后只需用{{each}}标签。

<template name="my_template"> 
    {{#each module in modules}} 
    <p>{{module.modulename}}</p> 
    {{/each}} 
</template> 

但是,如果每个模块连接到只有一所学校,我建议你的问题简单的解决方案,你不必创建学校和模块之间的集合。

你只需要创建两个集合SchoolsModules并添加到模块记录了schoolId场。

那么你的代码将看起来像:

Template.my_template.helpers({ 
    modules(){ 
     var myslug = FlowRouter.getParam('myslug'); 
     var mySchoolDoc = Schools.findOne({slug: myslug}); 
     return Modules.find({schoolId: mySchoolDoc._id}).fetch(); 
    } 
}); 
+0

反正有没有比这更重要的得分?这个专业贡献让我非常幸运。它工作完美.. – kehinde

+0

大家都在Stackoverflow专业;) –

+0

我非常感谢。再次,我复制代码复制另一个类似的场景,这次课程模块,我的惊喜是代码没有显示任何东西,我不知道是什么窍门。这只是复制并粘贴你的答案。就像复制代码一样。它可能是一个线程问题? – kehinde