У меня есть сложная нокаут-страница, которая условно отображает шаблон:
<!-- 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 кажется для выполнения как вычисляемый Observables. Почему и как это исправить? в качестве дополнительного вопроса к этому.