При каких условиях перерисовывается нативный шаблон Knockout

У меня есть сложная нокаут-страница, которая условно отображает шаблон:

<!-- 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. Почему и как это исправить? в качестве дополнительного вопроса к этому.


person Mark Robinson    schedule 28.06.2012    source источник


Ответы (1)


Шаблон в вашем случае будет перерисовываться при каждом изменении $root.itemToEdit.SomeObject. Если он содержит объект, то недостаточно изменить только одно из его свойств. Весь наблюдаемый объект должен быть обновлен, чтобы уведомления происходили.

Это единственный способ повторного рендеринга вашего шаблона, за исключением чего-то вроде повторного рендеринга из-за родительского шаблона.

person RP Niemeyer    schedule 28.06.2012