我有一个复杂的淘汰页面,有条件地呈现模板:
<!-- 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不是一个选项。 我对导致模板重新渲染的一般机制更感兴趣。
修改:请参阅The afterRender template call seems to be executed as a computedObservables. Why and how to fix it?作为后续问题。
答案 0 :(得分:2)
只要$root.itemToEdit.SomeObject
发生更改,您的案例中的模板就会重新呈现。如果它包含一个对象,那么仅仅改变其中一个属性就不够了。需要更新整个observable才能发生通知。
除了因为父模板而重新渲染之外,这是重新渲染模板的唯一方法。