【问题标题】:Reactive Template with compex object具有复杂对象的反应模板
【发布时间】:2013-01-09 15:36:23
【问题描述】:

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

Sprint: 
    WorkStories:
        Tasks

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

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

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

【问题讨论】:

    标签: meteor


    【解决方案1】:

    因为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

    希望对你有帮助

    【讨论】:

    • 这不起作用。它将加载初始对象,但如果我对 workStories 集合进行更改,它不会反映在模板中。
    • 你说得对,我已经对我的问题进行了更新并发布在流星谷歌组中。
    • 我刚刚尝试了您的示例,这似乎有效:Sprints.update(Sprints.findOne()._id, { $set: { "WorkStories.0.name": "updated_name1" } }) 注意引号的位置
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2020-03-21
    • 2018-03-21
    • 2018-10-06
    • 2013-03-15
    • 2021-03-03
    • 2021-07-29
    相关资源
    最近更新 更多