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

时间:2015-01-14 19:43:36

标签: javascript mongodb meteor subdocument minimongo

我在返回并显示我添加到子文档中的标记时遇到了一些麻烦。添加标签没有问题,但是想在每个标签的项目上添加标签。我根本无法找到一个资源来帮助我返回子文档中数组中的项目。我认为这是我所困的所有助手 - 基本上是语法正确的写作方式" Items。(this._id).itemTags.find();" :)

哦 - 我已经删除了很多HTML和JS,但是,是的,其他一切都运行良好。该系列是" Items"子文档是" itemTags",设置为" itemTags:[]"在插入期间。在我的测试环境中,我可以添加" Cats"和#34;狗"作为标签,可以通过" 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;
  }
});

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

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

2 个答案:

答案 0 :(得分:2)

您唯一的问题是尝试在同一个块中迭代游标和子数组。如果您将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>

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

答案 1 :(得分:0)

您是否有发布和订阅设置?

服务器/ publications.js

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

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

<强>的客户机/ subscriptions.js

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

Meteor.subscribe("items");