通过 Meteor / Mongo 返回子文档数组
Posted
技术标签:
【中文标题】通过 Meteor / Mongo 返回子文档数组【英文标题】:Returning subdocument array through Meteor / Mongo 【发布时间】:2015-03-13 02:50:28 【问题描述】:我在返回和显示要添加到子文档的标签时遇到了一点问题。我添加标签没有问题,但想在每个标签的项目上放置一个标签。我根本找不到可以帮助我返回子文档中数组中的项目的资源。我认为这是我卡住的所有帮手 - 基本上是语法正确的方式来编写“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);
【问题讨论】:
你能提供一个项目的架构吗? 没问题 - 添加到原始帖子中。 另外,您是否在 itemTags 帮助器中尝试过 Items.find(); 以及引用 this 在您的模板中,例如 this.itemText,而不是 itemTag? 【参考方案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。
编辑:
受@chip-castle 评论的启发,您实际上可以使用带有嵌套each
块的单个模板:
<template name="items">
#each items
<h2>itemText tags are:</h2>
<ul>
#each itemTags
<li>this</li>
/each
</ul>
/each
</template>
但在必要时使用单独的模板在设计和处理事件方面更加灵活。
【讨论】:
哇——谢谢!原来不是模板助手写错了。它需要完全删除,因为我的项目模板上已经有一个模板助手来拉取退货。删除该助手并更改为 this 后,它可以完美运行。感谢所有帮助! 没问题,很高兴你成功了。理论上,您可以在页面上将数组打印为 itemTags 并在后台返回其 toString() 方法,因此值以逗号分隔。但是没有办法提供一个dom(如列表)或单独设置它们的样式,或事件等。无论如何,对整个项目进行良好的锁定! :)【参考方案2】:您有发布和订阅设置吗?
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");
【讨论】:
是的,我能够看到我的所有项目并使用它们的修改功能对其进行操作,但我根本无法让标签出现在它们上面。以上是关于通过 Meteor / Mongo 返回子文档数组的主要内容,如果未能解决你的问题,请参考以下文章
如何在 javascript (meteor.js) 中操作返回的 mongo 集合/游标?