通过 Meteor 返回子文档数组 / Mongo

Returning subdocument array through Meteor / Mongo

我在 return 编辑和显示我添加到子文档的标签时遇到了一些问题。我添加标签没问题,但想为每个标签在项目上贴上标签。我根本找不到可以帮助我 return 子文档中数组中项目的资源。我认为这是我被卡住的所有帮助者 - 基本上是语法正确的方式来编写 "Items.(this._id).itemTags.find();" :)

哦 - 我已经删除了很多 HTML 和 JS,但是,是的,其他一切都工作正常。集合为"Items",子文档为"itemTags",插入时设置为"itemTags: []"。在我的测试环境中,我可以添加 "Cats" 和 "Dogs" 作为标签,并且可以通过 "Items.find().fetch();" 检查对象来验证它是否有效,但我很难显示它们。

HTML:

<template name="item">
  {{#each itemTags}}
    <span class="label label-default">{{itemTag}}</span>
  {{/each}}
</template>

JS:

Template.item.helpers({
   itemTags: function() {
    var currentUserId = Meteor.userId();
    return Items.find(); // yes, this line is completely wrong, but I'm lost hehe
  }
});

Template.item.events({
  'submit .add-tag': function(event) {
    event.preventDefault();

    var itemTag = event.target.text.value;

    Items.update(this._id, {$push: {itemTags: itemTag}});

    event.target.text.value = "";

    return false;
  }
});

数据库架构(如我的插入命令所示):

var item = {
  itemText: $(e.target).find('[name=itemText]').val(),
  createdAt: new Date(),
  createdBy: currentUserId,
  hard: false,
  difficulty: 'easy',
  checked: false,
  itemTags: [],
};

item._id = Items.insert(item);

您有发布和订阅设置吗?

server/publications.js

Items = new Mongo.Collection("items");

Meteor.publish("items", function () {
  return Items.find({});
});

client/subscriptions.js

Items = new Mongo.Collection("items");

Meteor.subscribe("items");

您唯一的问题是尝试在同一块中迭代游标和子数组。如果您将 items 模板和单独的 item 模板分开,您最终会得到想要的结果。

为了简化起见,我将您的代码更改为如下所示:

这是你的主体:

<body>
    {{> items}}
</body>

<template name="items">
  {{#each items}}
    {{> item}}
  {{/each}}
</template>

<template name="item">
  <h2>{{itemText}} tags are:</h2>
  <ul>
  {{#each itemTags}}
    <li>{{this}}</li>
  {{/each}}
  </ul>
</template>

这是你的帮手:

Template.items.helpers({
  items: function () {
    return Items.find();
  }
})

假设项目文档如下所示:

{ 
  itemText: String,
  itemTags: Array
}

我在 Meteorpad 上创建了一个应用供您使用:

http://meteorpad.com/pad/BmRQ5fkwWEMBKszJW/SO-27951102

您可以进一步更改那里的代码并实时查看更改。它基本上是流星的 jsfiddle。

编辑: 受@chip-castle 评论的启发,您实际上可以使用带有嵌套 each 块的单个模板:

<template name="items">
  {{#each items}}
    <h2>{{itemText}} tags are:</h2>
    <ul>
    {{#each itemTags}}
      <li>{{this}}</li>
    {{/each}}
    </ul>
  {{/each}}
</template>

但在必要时使用单独的模板在设计和处理事件方面更加灵活。