Meteor {{#each}} - 每个项目的条件格式

时间:2015-08-13 17:17:33

标签: javascript meteor handlebars.js

我从数据库中获取了一个光标,并且使用{{#each}}辅助标记执行通常的“列出每个项目”。

HTML

{{#each item}}
  <span class="label">{{this}}</span>
{{/each}}

JS

Template.name.helpers({
  item: function() {
    return Session.get('foo').items
  },
});

但是,由于每个项目属于 n 类之一,我想a)确定它是哪一个,并且b)相应地更改span类。

换句话说,类别的名称与我现在代替{{this}}的字符串相结合,并存储在一个单独的集合中,例如

{
  "_id": "whatnot"
  "item": "item1",
  "category": "bar"
}

目标是比较它们并确定与类别匹配的类:

{{#each item}}
  <span class="[[what "category" does ‘this’ belong to?]]">{{this}}</span>
{{/each}}

如果这是不可能或不好的方法,我会感谢任何更好的架构技巧,因为我认为这可能是问题所在。谢谢!

2 个答案:

答案 0 :(得分:1)

更简洁的方法是直接进入集合。

  1. 将会话var设置为您要在集合上执行的查询(不确定是否有必要,看起来您可能只是将查询结果保存到会话变量中?)
  2. 在帮助程序中执行集合查询
  3. #each在光标上
  4. 这很好,因为现在而不是奇迹wtf {{this}}在一个月内,你将拥有{{items}}。其次,您将在数据上下文中拥有该类别,因此您可以为其编写帮助程序。例如,如果您希望所有bar类别项目都具有baz类:

    return (this.category === 'bar') && 'baz'

答案 1 :(得分:1)

您可以与助手一起执行此操作:

HTML:

<template name="name">
  {{#each item}}
    {{> item}}
  {{/each}}
</template>

<template name="item">
  <span class="{{category}}">{{this}}</span>
</template>

JS

Template.name.helpers({
  item: function(){
    return Session.get('foo').items
  }
});

Template.item.helpers({
  category: function(){
    return Categories.findOne({_id: this.categoryId}).category;
  }
});

这假设您的 Items 集合通过名为 categoryId 的键链接到 Categories 集合 - 您的集合名称和键可能不同。它还假设您为可能的类别名称设置了css类。

你可能会想“哎呀,我每次显示一个项目时都要进行搜索?”答案是“是的,但是最小的确非常快,所以不要担心。”您在内存中搜索客户端,而不是通过网络搜索服务器到磁盘。

通常你的 item 助手会返回一个游标,例如Items.find(query),但看起来你正在执行查找并将其填充到其他地方的会话变量中。你或许可以摆脱这一额外的步骤。