好吧,我解决了这个问题。在进入细节之前,应该说 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>
此模板更改了数据上下文。它没有使用完整的项目所有者对象,而是仅使用该所有者的 ID。为了显示所有者的属性,使用了与名为 ownerProjectData 的模板助手的绑定。ownerProjectData 助手根据 id 获取 OwnerProject 对象并返回它。这有助于将项目所需的数据与不需要的数据分开。
此模式再次应用于项目上的每个绑定。我没有使用完整的项目模型,而是仅使用项目 ID 字段,这是任务真正需要的全部内容。对于我需要显示项目信息的区域,我再次使用了一个帮助程序,它根据循环中每次迭代中传递的 Id 获取完整的项目模型。
我遇到的一个非常重要的特点是,当我添加一个项目时,无论是否会调用完全重新运行的助手,我的数据建模如何改变。在插入新项目会导致完全重新运行时,OwnerProject 数据文档如下所示:
{
OwnerProject:
_id: "ownersautoassignedid"
firstName: "some",
lastName: "example",
projects:[
"idofproject1","idofproject2"
]
}
在这种情况下,OwnerProject 保留了对她拥有的所有项目的引用。如果我在她下面添加了一个新项目,我会插入该项目,获取它的 ID,然后更新所有者。然而,这将导致所有助手完全重新运行。相反,我从所有者那里删除了项目属性,并将项目结构更改为对所有者 ID 的引用。在模板方面,我通过选择所有者 ID 等于 superTemplate 上下文 ID 来获得项目 ID。这次插入新项目时,只调用了新项目的模板助手,其他项目不受影响。
你有它。一个很长的答案,描述了一个相当简单的问题解决方案,如果您遵循流星的标准文档,您肯定会遇到这个问题。希望这对将来有所帮助。
不要忘记查看 github 项目中的源代码并检查提交历史和 github 问题。它将描述我是如何到达这里的。