Meteor:在模板获取之前修改Mongo查询结果的最佳实践?

时间:2015-03-02 15:12:03

标签: javascript mongodb templates meteor conceptual

学习流星,我仍然陷入了概念性的泥潭。

我有一个集合,其中每个项目都有一个名为" props"拥有零个或多个属性名称:loudmouth,fixer,networker,outcast等。

我还有一组属性对象,每个属性对象都与一个字形图标相关联。

现在,我的模板将数据项显示为< li>< / li>的无序列表包含属性标识符的行。我想用相应的图标HTML

替换属性标识符
{name: "loudmouth", icon: "bullhorn", other: "rtgb"}
{name: "fixer", icon: "wrench", other: "iun"}
{name: "networker", icon: "link", other: "retf"}
{name: "outcast", icon: "ban-circle", other: "vcfdds"}

所以这......

<li>AAA loudmouth fixer outcast</li>
<li>BBB fixer networker</li>

......应该成为这个......

<li>AAA <span class="glyphicon glyphicon-bullhorn" aria-hidden="true"></span> <span class="glyphicon glyphicon-wrench" aria-hidden="true"></span> <span class="glyphicon glyphicon-ban-circle" aria-hidden="true"></span></li>
<li>BBB <span class="glyphicon glyphicon-wrench" aria-hidden="true"></span> <span class="glyphicon glyphicon-link" aria-hidden="true"></span></li>

这不是SQL连接;我是为每个返回的结果项添加属性。最好的方法是什么?

我尝试了几种方法,但它们非常混乱。

1)第一个是客户端中粗略的内部/外部循环作业。对于外部的每个数据项,我附加&lt; span&gt;标签从内循环的字符串连接。这似乎给了我某种竞争条件,带有虚假的&#34; undefined&#34; s。 (我还不清楚它的同步性规则)。我应该将属性集合预取到名称/值映射对象中吗?另外,奇怪的是,我的HTML显示了&lt; span&gt;的文本。标签而不是图标?!?!咦?

2)然后我尝试使用Meteor.method和Meteor.call在服务器端执行此操作。我无法同步获取数据,并且不能真正理解如何异步填充模板(来自回调)。您是否在Template.mine.created()期间填充数组,然后从Template.mine.helper返回数组?我是否认为Meteor.method / Meteor.call组合应该用于改变后端数据, NOT 用于检索后端数据?

有没有人知道关于此类事情的好教程?你会怎么做?

我希望这不会因为基于意见的原因而被拒绝,我确信所有有效的替代方案都会帮助其他有相关问题的人解决。

2 个答案:

答案 0 :(得分:0)

您可以使用参数化模板执行此操作:

<template name="glyph">
 <span class="glyphicon glyphicon-{{icon this}}" aria-hidden="true"></span>
</template>

添加辅助功能,如:

Template.glyph.helpers({
    icon: function(name) {
            return <Iconcollection>.findOne({name:name}).icon
    }   
}); 

然后你可以在你的模板中做这样的事情:

{{> glyph 'fixer'}}

或者,如果参数来自你的迭代器对象

{{> glyph name}}

(假设您的对象具有.name属性)

无论如何,我建议你重新阅读并试验Meteor中的助手和反应。由于您已经在客户端中拥有该集合,因此您通常只使用辅助函数来解决此类问题。 Meteor(re)会在收集更新时进行计算,因此您永远不必担心它。

答案 1 :(得分:0)

检查我的理解: 1位用户拥有1项物业。 1个属性有1 name,1 icon,1 other

如果是这种情况,请在门口检查您的3NF&amp;只是将它们嵌入用户文档中。因此,您的架构可能如下所示:

{userId: 'asldkfjz', 
 userName: 'Jonny', 
 properties: {
   name: "loudmouth", 
   icon: "bullhorn", 
   other: "rtgb"
 }
}

使用MongoDB,您总是需要权衡空间成本和访问成本。存储1个外键+额外订阅可能(绝对)比3个字符串更贵,对吗?

接下来,我将如何设置模板:

{{#each user}}
    {{>formatRow icon=properties.icon name=properties.name other=properties.other}}
{{/each}}

<template name="formatRow">
  <div class="blah">
    <li>{{name}} 
        <span class="glyphicon {{icon}}" aria-hidden="true"></span> 
    </li>
  </div>
</template>

我创建了一个包含3个变量的模板:iconnameother。然后,在我的主模板中,我传入这些变量。我把这两个步骤分开了,因为你以后可能会比以后只有lispan有更多的垃圾,或者你想在另一个模板中做这个,这个保持模块化。

唯一要做的就是设置一个模板助手,可以访问该集合:

Template.foo.helpers({
  user: function () {
    return users.find();
  }
});

了解详情:

http://docs.meteor.com/#/full/template_helpers https://github.com/meteor/meteor/blob/devel/packages/spacebars/README.md