1

所以这个问题是我之前的问题在什么情况下 Knockout 原生模板重新渲染的问题

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

这种行为似乎类似于computedObservables(aka dependentObservables),其中敲除跟踪它所依赖的模型的哪些部分,然后在它所依赖的值之一发生变化时重新运行computedObservables

为了证明这一点,我写了一个 jsFiddle:http: //jsfiddle.net/unklefolk/nczCt/1/

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

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

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

提前致谢。

4

1 回答 1

3

Knockout 使用计算的 observable 来包装元素上绑定的执行。这就是在依赖项更改时再次触发绑定的方式(此链接可能有助于进一步解释。

目前,afterRender不排除将代码添加到这些依赖项中。如果这不适合您的方案,那么有几种方法可以防止它。

  • 在以下位置运行您的代码setTimeout:例如http://jsfiddle.net/rniemeyer/nczCt/2/
  • 将您的代码包装在您自己的计算 observable 中,您可以立即处理,例如:http: //jsfiddle.net/rniemeyer/nczCt/3/ (我现在会这样做以避免 setTimeout)
  • 在 KO 2.2 中,您将能够peek在 observables 上使用新函数,该函数允许您在不创建依赖项的情况下获取值。
于 2012-08-03T13:33:39.507 回答