Javascript 在Meteor模板中按类别对集合的成员进行分组

Javascript 在Meteor模板中按类别对集合的成员进行分组,javascript,meteor,handlebars.js,Javascript,Meteor,Handlebars.js,我有一个训练集合,每个对象都有一个类别和一个名称。在HTML层,我创建一个类别标题,然后在下面显示一个训练列表 我有它的工作,但我没有办法做它的流星和/或车把的方式。我想我正在努力理解这个的上下文,以及如何将数据传递到模板中 以下是我的模板函数: Template.categories.getCategories = -> workouts = Workouts.find().fetch()

我有一个
训练
集合,每个对象都有一个
类别
和一个
名称
。在HTML层,我创建一个类别标题,然后在下面显示一个训练列表

我有它的工作,但我没有办法做它的流星和/或车把的方式。我想我正在努力理解这个
的上下文,以及如何将数据传递到模板中

以下是我的模板函数:

Template.categories.getCategories = ->                                             
  workouts = Workouts.find().fetch()                                               
  categories = _.map workouts, (workout) -> workout.category                       
  _.uniq categories                                                                

Template.workouts.getWorkouts = ->                                                 
  Workouts.find {category: this.toString()},                                       
    sort: ['category', 'name']
下面是模板文件:

<head>                                                                                                                         
</head>                                                                            

<body>                                                                                                                              
  {{> categories}}                                                                 
</body>                                                                            

<template name="categories">                                                       
  {{#each getCategories}}                                                          
    <h2>{{this}}</h2>                                                              
    {{> workouts}}                                                                 
  {{/each}}                                                                        
</template>                                                                        

<template name="workouts">                                                         
  {{#each getWorkouts}}                                                            
    <div class="workout container">                                                
      <div>                                                                        
        {{name}}                                                                   
      </div>                                                                       
      <div>                                                                        
        {{units}}                                                                  
      </div>                                                                       
    </div>                                                                         
  {{/each}}                                                                        
</template>  

{{>类别}
{{{#每个getCategories}
{{this}}
{{>训练}
{{/每个}}
{{{#每次锻炼}
{{name}}
{{units}}
{{/每个}}
Template.categories.getCategories
内部,
这是
窗口
。但是在
Template.categories.getCategories
中,它是与
categories
模板中的
this
等价的字符串对象,它是一个字符串文本。嗯


同样,这是有效的。我得到了一个分类标题,下面是一个训练列表,但是有什么更好的方法可以做到这一点呢?

我不认为您的实现还有太多改进余地,尽管通过避免
这一点,下面的内容可能会更清楚一些

对不起,我不知道Coffeescript,所以我想我应该通过编写javascript来避免混淆

Template.categories.getCategories = function(){  
  var categories = Workouts.find({}, {sort: {category: 1}, fields: {category: 1}}).fetch();

  return _.uniq( categories, true, function (workout){ 
    return workout.category;
  });    
};                                            

Template.categories.workouts = function ( category ){
  return Workouts.find( { category: category}, { sort: {name : 1}});
};

<template name="categories">                                                       
  {{#each getCategories}}                                                          
    <h2>{{category}}</h2>                                                              
    {{#each workouts category}}
      {{> workout}}                                                                 
    {{/each}}
  {{/each}}                                                                        
</template>                                                                        

<template name="workout">                                                                                                               
  <div class="workout container">                                                
    <div>                                                                        
      {{name}}                                                                   
    </div>                                                                       
    <div>                                                                        
      {{units}}                                                                  
    </div>                                                                       
  </div>                                                                                                                                            
</template>  
Template.categories.getCategories=function(){
var categories=Workouts.find({},{sort:{categories:1},fields:{categories:1}).fetch();
返回uq.uniq(类别、真值、函数(训练){
返回训练类别;
});    
};                                            
Template.categories.workouts=功能(类别){
返回训练。查找({category:category},{sort:{name:1});
};
{{{#每个getCategories}
{{category}}
{{#每个训练类别}
{{>锻炼}
{{/每个}}
{{/每个}}
{{name}}
{{units}}

这不起作用。在
categories
模板中,
categories
未定义,因为
getCategory
返回字符串数组,而不是对象。我认为这就是造成混乱的原因。与其返回字符串数组,不如查询集合中的不同类别,并返回所有
训练的子集
训练的集合。这不仅可以将JS转换为DB,还可以使模板中发生的事情更加清晰?在
模板.categories.workouts
中,
类别
始终未定义。问题在于使用uq.uniq。我将更新代码。我需要获取q.uniq的游标。现在工作。如果您在其他地方需要这些类别,最好将它们保存在本地集合中。