我想基于此文档呈现反应式模板:
Sprint:
WorkStories:
Tasks
我知道这可以通过为每个“级别”制作Meteor集合来完成,但这意味着结果实际上存储为数据库中的单独文档。我想知道是否可以为Sprint
创建一个集合/文档,它具有WorkStories
的标准集合,每个集合都有Tasks
的标准集合,呈现为反应模板。
我见过[Meteor.deps.Context] [1],但我无法弄清楚如何连线(或者即使它是正确的工具),并且没有一个例子做这样的事情。
我也看过[这个问题] [2],但他似乎要求连接相关但又分开的文件,而不是单个文件。
答案 0 :(得分:3)
由于客户端上的database queries on collections are already reactive variables,以下内容将使用嵌套 Sprint
呈现带有的一个 WorkStories
文档模板中嵌套 Tasks
:
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' }] }] });
}
});
}
以答案更新
Per @ 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:
但是如果修饰符不包含任何$ -operators,那么它将被解释为文字文档,并完全替换以前在数据库中的任何内容。 (验证更新目前不支持文字文档修饰符。
当然,您想要的是在嵌套文档上使用$set
样式运算符,并在嵌套属性更改时使模板重新呈现,而>不必替换整个文档在表中。 The 0.5.3 version of Meteor包括搜索子数组的功能:
Allow querying specific array elements (foo.1.bar).
我已尝试进行.
子数组搜索,但尚未能更新原始实体的WorkStories
子文档,因此我posted a question在谷歌谈话中。
希望这有帮助