在什么条件下Knockout本机模板重新渲染

时间:2012-06-28 09:19:46

标签: templates knockout.js knockout-2.0

我有一个复杂的淘汰页面,有条件地呈现模板:

<!-- 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?作为后续问题。

1 个答案:

答案 0 :(得分:2)

只要$root.itemToEdit.SomeObject发生更改,您的案例中的模板就会重新呈现。如果它包含一个对象,那么仅仅改变其中一个属性就不够了。需要更新整个observable才能发生通知。

除了因为父模板而重新渲染之外,这是重新渲染模板的唯一方法。