我有一个复杂的淘汰页面,它有条件地呈现模板:
<!-- ko template: {'if': $root.itemToEdit.SomeObject() === $data, name: 'EditItemTemplate', afterRender: $root.initializeEditPanel } -->
<!-- /ko -->
和模板:
<script type="text/html" id="EditItemTemplate">
<div id="editContainer" class="fd_editContainer">
//.. lots of markup and knockout bindings ...
<input class="checkbox" id="questionDisplayOptionOverride" type="checkbox" data-bind="checked: $data.AnObject().ItemText.HasOverrideText" />
//.. lots of markup and knockout bindings ...
</div>
</script>
这让我感到困惑。标记中有一堆元素会改变$data
对象的属性。这些不会导致模板重新渲染。但是,由于某种原因,当单击某个复选框 ( questionDisplayOptionOverride
) 时,会重新呈现完整模板并调用我的afterRender
函数$root.initializeEditPanel
。我不知道为什么会发生这种情况,因为questionDisplayOptionOverride
控件仅更改对象computedObservable
内部的$data
属性,而不是实际$data
对象本身。
所以我的问题:
在什么情况下模板会完全重新渲染?
很明显,如果模板条件'if': $root.itemToEdit.SomeObject() === $data
发生了变化,模板会重新渲染,但是还有其他条件会发生这种情况吗?
由于我的页面的复杂性,jsFiddle 不是一个选项。我对导致模板重新渲染的一般机制更感兴趣。
编辑:请参阅afterRender 模板调用似乎是作为 computedObservables 执行的。为什么以及如何解决它?作为对此的后续问题。