2

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

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

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

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

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

这些项目在#with OwnerProject 绑定下。

这些项目使用#each 绑定列出。

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

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

更改项目数据时,将运行该项目下任务的模板帮助程序。当所有者的名字更改时,每个助手都会运行。根据 blaze 文档,这两种情况都不应该发生。它应该只是已更改字段的助手。

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

4

1 回答 1

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>

此模板更改了数据上下文。它没有使用完整的项目所有者对象,而是仅使用该所有者的 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 问题。它将描述我是如何到达这里的。

于 2014-08-20T10:17:47.827 回答