具有复杂对象的反应模板

时间:2013-01-08 17:17:42

标签: meteor

我想基于此文档呈现反应式模板:

Sprint: 
    WorkStories:
        Tasks

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

我见过[Meteor.deps.Context] [1],但我无法弄清楚如何连线(或者即使它是正确的工具),并且没有一个例子做这样的事情。

我也看过[这个问题] [2],但他似乎要求连接相关但又分开的文件,而不是单个文件。

1 个答案:

答案 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在谷歌谈话中。

希望这有帮助