我有一個複雜的淘汰賽頁面,有條件地呈現模板:在什麼條件下淘汰賽本地模板重新渲染
<!-- 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
控件僅改變$data
對象內的computedObservable
屬性,而不是實際的$data
對象本身。
所以我的問題:
在什麼條件下一個模板完全重新呈現?
很明顯,如果模板條件'if': $root.itemToEdit.SomeObject() === $data
更改模板將重新呈現,但是有沒有其他條件下會發生這種情況?
由於我的頁面的複雜性,jsFiddle不是一個選項。 我對導致模板重新呈現的一般機制更感興趣。
編輯:見The afterRender template call seems to be executed as a computedObservables. Why and how to fix it?作爲後續行動的問題這一點。