在一个AfterRender模板调用似乎为computedObservables执行。 为什么以

2019-10-17 02:55发布

所以,这个问题从我刚才的问题如下对在什么情况下淘汰赛本地模板重新渲染

经过一番调查,看来,如果一个模板定义afterRender功能和afterRender函数引用零件模型,然后,如果模型的一部分随后被改变时, afterRender函数被再次调用。

这种行为似乎类似于computedObservables (又名dependentObservables ),它取决于该模型的一部分,然后淘汰赛曲目重新运行computedObservables每当值之一这取决于变化。

为了证明这一点,我已经写了的jsfiddle: http://jsfiddle.net/unklefolk/nczCt/1/

正如所预期的视图时呈现的一个AfterRender函数被调用。 但是,如果你单击该复选框,一个AfterRender功能再次,因为它使用运行viewModel.selectedPet().pet().IsHappy()

这是没有道理给我。 所以我的问题是:

  • 这就是一个bug afterRender功能正在重新运行?
  • 我怎样才能保证afterRender功能只运行一次?

提前致谢。

Answer 1:

敲除使用计算出的可观测到包装一个元件上的绑定的执行。 这是怎么绑定再次触发时依赖的变化(此链接可能有助于进一步解释。

目前, afterRender代码不排除加入到这些相关性。 如果这是不可取的为您的方案,然后有一对夫妇的方式,以防止它。

  • 在运行代码setTimeout :像http://jsfiddle.net/rniemeyer/nczCt/2/
  • 包装你的代码在自己的计算机可观察到的,你马上处理,如: http://jsfiddle.net/rniemeyer/nczCt/3/ (我现在这样做是为了避免setTimeout的)
  • 在KO 2.2,你将能够使用新的peek对观测功能,可以让你获取的价值,而无需创建依赖性。


文章来源: The afterRender template call seems to be executed as a computedObservables. Why and how to fix it?