当父级中不相关的字段发生变化时,为什么调用with / each块中的所有Meteor模板助手?

时间:2014-08-19 05:56:13

标签: meteor meteor-blaze

在Meteor模板中使用#with块时,如果我编辑块的最外层逻辑部分中的单个字段,它仍然会调用#with块中的所有模板助手再次运行。这也适用于每一个。为了证明这一点,我有一个上传到github的项目。它可以在:

找到

https://github.com/adnancin/meteor-test-template-render

如果您下载并运行该项目,您将看到一个呈现以下内容的页面:

  • 项目所有者(字段是firstName和lastName)。
  • 项目(字段是名称和类型)。
  • 每个项目的任务(字段为projectId,name和estimate)

在默认数据集中,有一个项目所有者,两个项目和两个任务,其中两个任务属于第一个项目。

项目属于#with OwnerProject绑定。

使用#each绑定列出项目。

任务也在使用#each绑定列出的项目下。

我已经给出了两个按钮来更改数据。一个人改变了第一个项目数据。另一个更改了项目所有者的名字。模板助手具有控制台日志以显示哪一个运行。

更改项目数据后,将运行该项目下任务的模板助手。更改所有者的名字后,将运行每个帮助程序。根据火焰文档,这两种情况都不应该发生。它应该只是已经改变的领域的帮助者。

这是一个错误吗?或者它是一个有明显/非显而易见的解决方法的功能?

1 个答案:

答案 0 :(得分:1)

好吧,我解决了这个问题。在进入细节之前,应该说Meteor已选择实现数据模板助手,以便在父数据上下文中的任何更改时重新运行。为什么?我还不确定。 (等待答复)。与此同时,我意识到如果数据上下文文档的更改可以触发一整套重新运行,那么最好的办法就是从数据上下文中删除可更改的信息。我已经在github上更新了我的项目(链接在问题中)以反映这一点。

以前的模板类似

<强> projecttemplate.html


    <template name="projectTemplate">
        {{#with superTemplate}}
            {{fullName}}
            {{#each multiProject}}
                <h3>Here is the {{this.name}}</h3>
                <p>And this is the {{type}}</p>
                <p>And here they are combined: {{nameType}}</p>
                <p>And these are the tasks associated with it </p>
                {{> tasksTemplate}}
            {{/each}}
        {{/with}}
    </template>

在此,超级模板为其他所有内容设置上下文。项目业主参考了她拥有的项目,并用于多个项目。在多个项目循环中,该项目下每个任务的数据上下文是一个完整的项目对象。

当前模板

<强> projecttemplate.html

    <template name="projectTemplate">
        {{#with ownerProjectId}}
            {{#with ownerProjectData}}
                {{fullName}}
            {{/with}}
            {{#each multiProject}}
                {{#with singleProjectData}}
                    <h3>Here is the {{this.name}}</h3>
                    <p>And this is the {{type}}</p>
                    <p>And here they are combined: {{nameType}}</p>
                    <p>And these are the tasks associated with it </p>
                {{/with}}
                {{> tasksTemplate}}
            {{/each}}
        {{/with}}
    </template>

此模板更改了数据上下文。它不使用完整的Project owner对象,而只使用该所有者的Id。为了显示所有者的属性,使用了绑定到名为ownerProjectData的模板助手的方法。 ownerProjectData助手根据id获取OwnerProject对象并返回它。这有助于将项目所需的数据与不需要的数据分开。

此模式再次应用于项目的每个绑定。我不使用完整的项目模型,而只使用项目ID字段,这是任务真正需要的。对于我需要显示项目信息的区域,我再次使用一个帮助程序,根据循环中每次迭代传递的Id获取完整的项目模型。

我遇到的非常重要的一个特点是,当我添加项目时,无论是否完全重新运行帮助程序,我的数据建模都会发生变化。在插入新项目将导致完全重新运行时,OwnerProject数据文档如下所示:

    {
    OwnerProject:
        _id: "ownersautoassignedid"
        firstName: "some",
        lastName: "example",
        projects:[
            "idofproject1","idofproject2"
        ]
    }

在这种情况下,OwnerProject保留了对她拥有的所有项目的引用。如果我在她下面添加了一个新项目,我会插入项目,获取其ID,然后更新所有者。但是,这将导致所有助手的完全重新运行。相反,我从所有者中删除了项目属性,并更改了项目结构以引用所有者ID。在模板方面,我通过执行选择来获取项目ID,其中所有者ID等于superTemplate上下文ID。这次插入新项目时,只调用新项目的模板助手,其他项目不受影响。

你有它。一个很长的答案,描述了一个相当简单的解决方案,如果你遵循meteor的标准文档,你肯定会遇到这个问题。希望这有助于将来。

不要忘记查看github项目中的源代码并检查提交历史记录和github问题。它将描述我是如何到达这里的。