学习流星,我仍然陷入了概念性的泥潭。
我有一个集合,其中每个项目都有一个名为" 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 用于检索后端数据?
有没有人知道关于此类事情的好教程?你会怎么做?
我希望这不会因为基于意见的原因而被拒绝,我确信所有有效的替代方案都会帮助其他有相关问题的人解决。
答案 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个变量的模板:icon
,name
和other
。然后,在我的主模板中,我传入这些变量。我把这两个步骤分开了,因为你以后可能会比以后只有li
和span
有更多的垃圾,或者你想在另一个模板中做这个,这个保持模块化。
唯一要做的就是设置一个模板助手,可以访问该集合:
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