Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么当父块中的不相关字段更改时,with/each块中的所有Meteor模板帮助程序都被调用?_Meteor_Meteor Blaze - Fatal编程技术网

为什么当父块中的不相关字段更改时,with/each块中的所有Meteor模板帮助程序都被调用?

为什么当父块中的不相关字段更改时,with/each块中的所有Meteor模板帮助程序都被调用?,meteor,meteor-blaze,Meteor,Meteor Blaze,在Meteor templates中使用#with块时,如果我在块的最外层逻辑部分编辑单个字段,它仍然会导致再次调用#with块中的所有模板帮助程序。这也适用于每个人。为了证明这一点,我上传了一个项目到github。可在以下网址找到: 如果下载并运行该项目,您将看到一个呈现以下内容的页面: 项目所有者(字段为firstName和lastName) 项目(字段为名称和类型) 每个项目的任务(字段为projectId、name和estimate) 在默认数据集中,有一个项目所有者、两个项目和两

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

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

  • 项目所有者(字段为firstName和lastName)
  • 项目(字段为名称和类型)
  • 每个项目的任务(字段为projectId、name和estimate)
在默认数据集中,有一个项目所有者、两个项目和两个任务,其中两个任务属于第一个项目

这些项目受业主项目约束

使用#每个绑定列出项目

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

我给了两个按钮来更改数据。其中一个更改了第一个项目数据。另一个更改项目所有者的名字。模板帮助程序具有控制台日志,以显示运行的模板

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


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

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

模板以前看起来像

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,然后更新所有者。但是,这将导致所有帮助程序完全重新运行。相反我从所有者中删除了projects属性,并更改了项目结构以引用所有者id。在模板端,我通过选择所有者id等于superTemplate上下文id的位置来获取项目id。这次插入新项目时,仅调用新项目的模板帮助器,而另一个模板帮助器项目未受影响

给你。这是一个很长的答案,描述了一个非常简单的问题解决方案,如果您遵循meteor的标准文档,您肯定会遇到这个问题。希望这对将来有所帮助

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

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