2012-06-28 40 views
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控件僅改變$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?作爲後續行動的問題這一點。

回答

2

您的案例中的模板將在$root.itemToEdit.SomeObject更改時重新呈現。如果它包含一個對象,那麼僅僅改變它的一個屬性是不夠的。整個觀測值需要更新才能發生通知。

這是您的模板得到重新渲染的唯一方式,除了因爲父模板而重新渲染之外。