Arrays 尝试迭代数组时出现异常错误
我有一个集合,Arrays 尝试迭代数组时出现异常错误,arrays,mongodb,meteor,Arrays,Mongodb,Meteor,我有一个集合,Ages,它只有一个键:Ages 我在其中存储了一个字符串数组,如下所示: ['51', '24', '21', '19', '15'] 我在如何在模板中对其进行迭代方面有点困难,但我发现这是有效的。首先是HTML: <template name="ageFilter"> {{#each age}} <li> {{this}} </li> {{/each}} </template> 这是一个相当
Ages
,它只有一个键:Ages
我在其中存储了一个字符串数组,如下所示:
['51', '24', '21', '19', '15']
我在如何在模板中对其进行迭代方面有点困难,但我发现这是有效的。首先是HTML:
<template name="ageFilter">
{{#each age}}
<li>
{{this}}
</li>
{{/each}}
</template>
这是一个相当丑陋的解决方案,它依赖于我的数据库中只有一个对象(因为我使用了findOne()
),但这不是一个大问题,它可以工作。模板迭代数组并输出它
只有一个问题:浏览器控制台抛出错误
Exception in template helper: TypeError: Cannot read property 'ages' of undefined
这是为什么?我该如何处理它?可能在订阅
Ages
出版物之前,首先调用了age
帮助程序,因此对Ages.findOne()
的第一次调用没有返回任何内容。您可以检查Ages
文档是否已正确获取:
Template.ageFilter.helpers({
age: function() {
var ageItem = Ages.findOne();
return (ageItem ? ageItem.ages : null);
}
});
但这只是绕过问题。最好的方法是确保在订阅完成之前不会呈现模板。为此,您可以使用并将订阅放入waitOn
。例如:
Router.route('home', {
path: '/',
waitOn: function() {
return Meteor.subscribe('ages');
}
});
此外,总的来说,您可能希望更改设计,只需在Ages
集合中为每个文档添加一个age值,存储在value
之类的键中。这似乎更符合逻辑。这样您可以:
<template name="ageFilter">
{{#each ages}}
<li>
{{value}}
</li>
{{/each}}
</template>
谢谢你的回答。我的订阅被加载到Iron Router的“onBeforeAction”中,很遗憾是出于必要。(编辑:事实上,那是我的另一个订阅,所以可以使用!)你的上一个建议对这个问题没有帮助,是吗?我一直在犹豫如何存储它,我很高兴像你说的那样存储它并不疯狂,因为这将是我的首选方法。是的,我的上一个建议也会解决你的显示控制台错误问题。最初不会提取年龄,不会显示
,但不会显示er控制台中的ror。当然,在您的订阅赶上之前,您的年龄将自动显示:)它看起来应该是即时的。哦,这让人松了一口气,因为将订阅切换到waitOn
不起作用:(在find()
上链接ages
是否存在固有的错误?是的,如果不确定某个函数是否会返回对象,则不应在调用某个函数时直接获取键值。在您的情况下,ages.findOne()
可以返回对象或未定义的
,因此立即询问其年龄
值是不明智的。即使您实际等待订阅!因为您永远不知道是否有一天您的收藏将是空的。
<template name="ageFilter">
{{#each ages}}
<li>
{{value}}
</li>
{{/each}}
</template>
Template.ageFilter.helpers({
ages: function() {
return Ages.find().fetch();
}
});