通过流星/蒙戈返回子文档阵列(Returning subdocument array through

2019-10-21 14:27发布

我有一个小麻烦返回并显示我正在为一个子文档的标签。 我没有问题添加标签,但是想要把标签上的每个标签的项目。 我根本无法找到的资源,可以帮助我在数组中的子文档内归还物品。 我想,这一切都在那里,我被卡住了帮手 - 基本上写的语法正确的方式“的相关文件(this._id).itemTags.find();”。 :)

噢 - 我剪了很多的HTML和JS的,但是,是的,一切工作正常。 集合是“条”与子文档是“itemTags”,用“itemTags:[]”设置插入过程中。 在我的测试环境,我可以添加“猫”和“狗”的标签,并可以验证它的工作原理是通过检查对象“Items.find()取();”。 但我在努力,以显示它们。

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

Answer 1:

您的唯一的问题是试图要迭代的光标和相同的每个块内的子阵列。 如果你分开你的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。

编辑:由@芯片城堡的评论风格,你其实可以用一个模板嵌套each块:

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

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



Answer 2:

你有一个发布和订阅设置吗?

服务器/ publications.js

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

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

客户机/ subscriptions.js

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

Meteor.subscribe("items");


文章来源: Returning subdocument array through Meteor / Mongo