Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Templates afterRender模板调用似乎是作为computedObservables执行的。为什么以及如何修复它?_Templates_Knockout.js_Knockout 2.0 - Fatal编程技术网

Templates afterRender模板调用似乎是作为computedObservables执行的。为什么以及如何修复它?

Templates afterRender模板调用似乎是作为computedObservables执行的。为什么以及如何修复它?,templates,knockout.js,knockout-2.0,Templates,Knockout.js,Knockout 2.0,所以这个问题是我上一个问题的后续问题 经过一些调查,似乎如果模板定义了afterRender函数,并且afterRender函数引用了零件模型,那么,如果随后更改了模型的该部分,则再次调用afterRender函数 这种行为似乎类似于计算的可观测值(又称依赖于可观测值),在这种情况下,敲除跟踪它所依赖的模型的哪些部分,然后在它所依赖的某个值发生变化时重新运行计算的可观测值 为了演示这一点,我编写了一个JSFIDLE: 正如预期的那样,渲染视图时会调用afterRender函数。但是,如果单击该复

所以这个问题是我上一个问题的后续问题

经过一些调查,似乎如果模板定义了
afterRender
函数,并且
afterRender
函数引用了零件模型,那么,如果随后更改了模型的该部分,则再次调用
afterRender
函数

这种行为似乎类似于
计算的可观测值
(又称
依赖于可观测值
),在这种情况下,敲除跟踪它所依赖的模型的哪些部分,然后在它所依赖的某个值发生变化时重新运行
计算的可观测值

为了演示这一点,我编写了一个JSFIDLE:

正如预期的那样,渲染视图时会调用afterRender函数。但是,如果单击该复选框,afterRender函数将再次运行,因为它使用了
viewModel.selectedPet().pet().IsHappy()

这对我来说没有意义。所以我的问题是:

  • 这是重新运行
    afterRender
    功能的错误吗?
  • 如何确保
    afterRender
    功能只运行一次?

提前感谢。

Knockout使用计算的可观察对象来包装元素上绑定的执行。这就是当依赖项发生变化时如何再次触发绑定(这可能有助于进一步解释)

目前,
afterRender
代码未被排除在添加这些依赖项之外。如果这不适合您的场景,那么有几种方法可以防止它

  • setTimeout
    中运行代码:如
  • 将您的代码包装在自己的计算可观察对象中,然后立即进行如下处理:(我现在这样做是为了避免setTimeout)
  • 在KO 2.2中,您将能够对可观察对象使用新的
    peek
    函数,该函数允许您在不创建依赖关系的情况下获取值

回答得很好。谢谢,Ryan。期待KO 2.2。