在Meteor模板中使用#with块时,如果我编辑块的最外层逻辑部分中的单个字段,它仍然会调用#with块中的所有模板助手再次运行。这也适用于每一个。为了证明这一点,我有一个上传到github的项目。它可以在:
找到https://github.com/adnancin/meteor-test-template-render
如果您下载并运行该项目,您将看到一个呈现以下内容的页面:
在默认数据集中,有一个项目所有者,两个项目和两个任务,其中两个任务属于第一个项目。
项目属于#with OwnerProject绑定。
使用#each绑定列出项目。
任务也在使用#each绑定列出的项目下。
我已经给出了两个按钮来更改数据。一个人改变了第一个项目数据。另一个更改了项目所有者的名字。模板助手具有控制台日志以显示哪一个运行。
更改项目数据后,将运行该项目下任务的模板助手。更改所有者的名字后,将运行每个帮助程序。根据火焰文档,这两种情况都不应该发生。它应该只是已经改变的领域的帮助者。
这是一个错误吗?或者它是一个有明显/非显而易见的解决方法的功能?
答案 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问题。它将描述我是如何到达这里的。