3

我想根据这个文档渲染一个响应式模板:

Sprint: 
    WorkStories:
        Tasks

我知道这可以通过为每个“级别”制作一个 Meteor 集合来完成,但这意味着结果实际上是作为单独的文档存储在数据库中的。我想知道是否有可能拥有一个集合/文档Sprint,该集合/文档具有标准WorkStories集合,每个集合都有一个标准集合Tasks,呈现为反应式模板。

我已经看过 [Meteor.deps.Context][1],但我不知道如何连接它(或者即使它是正确的工具),而且没有一个示例做这样的事情。

我也看过 [this question][2],但他似乎在询问连接相关但独立的文档,而不是呈现单个文档。

4

1 回答 1

3

因为集合上的数据库查询已经是客户端上的反应变量,所以下面将呈现一个 嵌套在模板中的嵌套文档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' }] }] });
        }
  });
}

更新答案

根据下面@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在嵌套文档上使用样式运算符,并让模板在其嵌套属性发生更改时重新呈现,而无需替换表中的整个文档。Meteor 的 0.5.3 版本包括搜索子数组的能力:

Allow querying specific array elements (foo.1.bar).

我尝试进行.子数组搜索,但还无法更新WorkStories原始实体的子文档,所以我在 google talk 中发布了一个问题。

希望这可以帮助

于 2013-01-08T19:07:08.567 回答