因为database queries on collections are already reactive variables 在客户端,下面将呈现一个 Sprint 文档 nested WorkStories 具有 nested @ 987654327@ 在模板中:
HTML:
<head>
<title>Sprints Example</title>
</head>
<body>
{{> sprints }}
</body>
<template name="sprints">
{{#each items}}
<div>Name: {{name}}</div>
{{#each this.WorkStories}}
<div>{{name}}</div>
{{#each this.Tasks}}
<div>{{name}}</div>
{{/each}}
{{/each}}
{{/each}}
</template>
Javascript:
Sprints = new Meteor.Collection("sprints");
if (Meteor.isClient) {
Template.sprints.items = function () {
return Sprints.find({});
};
}
if (Meteor.isServer) {
Meteor.startup(function () {
if (Sprints.find().count() === 0) {
Sprints.insert({ name: 'sprint1', WorkStories: [{ name: 'workStory1', Tasks: [{ name: 'task1' }, { name: 'task2' }, { name: 'task3' }] }, { name: 'workStory2', Tasks: [{ name: 'task1' }, { name: 'task2' }, { name: 'task3' }] }] });
}
});
}
有答案的更新
根据下面@Paul-Young 的评论,我使用$set 的问题是更新中缺少引号。一旦嵌套对象在 Template 中呈现,从 Meteor 0.5.3 开始,您可以简单地更新子数组:
Sprints.update(Sprints.findOne()._id, { $set: { "WorkStories.0.name": "updated_name1" } });
背景信息
这确实加载了初始对象,但更新似乎有问题。我可以通过在控制台中调用以下命令来重新渲染模板:
Sprints.update(Sprints.findOne()._id, { name: 'sprint777', WorkStories: [{ name: 'workStory1232', Tasks: [{ name: 'task221' }, { name: 'task2' }, { name: 'task3' }] }, { name: 'workStory2', Tasks: [{ name: 'task1' }, { name: 'task2' }, { name: 'task3' }] }] })
遵循这些规则,根据Meteor Docs:
但是,如果修饰符不包含任何 $ 运算符,则它会被解释为文字文档,并完全替换数据库中先前的任何内容。 (经过验证的更新目前不支持文字文档修饰符。
当然,您想要的是在嵌套文档上使用$set 样式运算符,并让模板在其嵌套属性更改时重新呈现而无需替换整个文档桌子。 The 0.5.3 version of Meteor 包含搜索子数组的功能:
Allow querying specific array elements (foo.1.bar).
我尝试进行.子数组搜索,但还不能更新原始实体的WorkStories子文档,所以我在google talk中posted a question。
希望对你有帮助