1

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

<!-- 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 模板调用似乎是作为 computedObservables 执行的。为什么以及如何解决它?作为对此的后续问题。

4

1 回答 1

2

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

这是您的模板重新渲染的唯一方法,除了由于父模板而重新渲染之类的事情。

于 2012-06-28T13:10:17.153 回答