1

我在返回和显示要添加到子文档的标签时遇到了一些麻烦。我添加标签没有问题,但想在每个标签的项目上放置一个标签。我根本找不到可以帮助我返回子文档中数组中的项目的资源。我认为这是我卡住的所有帮手 - 基本上是语法正确的方式来编写“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);
4

2 回答 2

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>

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

于 2015-01-14T22:54:07.413 回答
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");
于 2015-01-14T22:37:44.473 回答