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();
      }
    });