【问题标题】:How to loop through embedded document in Meteor如何在 Meteor 中循环嵌入文档
【发布时间】:2016-08-17 01:59:21
【问题描述】:

我在 MongoDB 集合“作者”中有一个嵌入文档:

{"Name": "John Doe",
 "Country": "U.S.A", 
 "Books": [
    {"BName": "Book1", "Year": "1950"},
    {"BName": "Book2", "Year": "1960"}
  ]
}

我想访问 Books 数据,遍历它并在表格中显示每本书。

这就是我的 JS 文件的样子

Template.Author.helpers({  
   author: function() {
       //_id of the Author is passed via the URL
       return Author.find({"_id": FlowRouter.getParam('_id')})
   }
 });

这是我的报告的 HTML

<template name="Author">
<body>
  <div class="row">
    <div class="col-md-2">
      Book Name
    </div>
    <div class="col-md-2">
      Year
    </div>
  </div>
  {{#each author}}
    {{> bookdetails}}
  {{/each}}
</body>
</template>

<template name="bookdetails">
  <div class="row">
    <div class="col-md-2">
      {{Books.BName}}
    </div>
    <div class="col-md-2">
      {{Books.Year}}
    </div>
  </div>
</template>

当我在嵌入的 Books 文档中只有一条记录时,这有效,但当我有不止一条记录时无效 - 这是有道理的,因为 'Books.BName' 在这一点上是模棱两可的。

我需要遍历“Books”并输出每个 BName 和 Year。 This 答案是我发现的最接近的答案,但我得到了错误: TypeError:_.value 不是函数 这可能是因为我有一个嵌入文档而不是数组。

【问题讨论】:

    标签: meteor


    【解决方案1】:

    您的命名令人困惑。您有 Book 帮助器返回作者,这就是您传递给 bookdetails 模板的内容。您应该将帮助程序重命名为 author 以减少混淆。然后您可以使用{{#each author.Books}} 循环浏览实际的书籍数组。

    此外,在bookdetails 模板中直接访问书籍参数,例如{{BName}} 而不是 {{Books.BName}}

    【讨论】:

    • 谢谢@hubert-og。关于命名的好点 - 我在问题中修改了它。 {{#each author.Books}} 是我一直在寻找的方向,但是进行更改并更改为 {{BName}}(一旦您遍历 author.Books 就有意义)对我不起作用(不返回任何数据)。
    • 我没有注意到你也在做Author.find。将其更改为 Author.findOne 以及其他调整。
    • 谢谢,这行得通!但是,当给定作者只有一本书时,它会失败(而不是当它工作时不止一本)。我收到以下错误:{{#each}} currently only accepts arrays, cursors or falsey values.
    • 这可能是因为在这种情况下您没有遵循相同的架构,而是将单本书作为对象而不是包含单个对象的数组传递。最好保留一个模式。
    • 完美,非常感谢!现在可以了。我花了很多天时间试图解决这个问题 - 非常感谢您的帮助和耐心!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 2011-03-10
    • 2016-04-03
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多