2010-06-22 15 views
0

http://wwwendt.de/tech/dynatree/index.htmlDynatree的addChild - 該組件的作者

的問題,我想澄清如下: 時的addChild調用 - 不整棵樹得到重新渲染或剛修改過的節點(添加節點和節點是有新的孩子)?

我得到2個衝突的碎片信息的: Lazy Loading in dynatree 它說,只有受影響的節點將得到重新渲染

Dynatree slow when dynamically loaded with 100+ nodes 這裏它說,它得到重新渲染每次的addChild使用

也許,我錯過了什麼?

這是哪一個?

回答

1

Dynatree將節點存儲在內部結構中。 '渲染'是在 中創建或更新HTML元素的過程,DOM到 反映了樹的狀態。例如 例如分支中的最後一個節點有一個特殊的類名,所以 附加一個 節點需要從前一個「最後一個節點」中刪除該類,並將 添加到 新節點中。

每次調用.addChild(數據)時,都會觸發渲染。 如果通過一次調用傳遞100個節點,渲染只完成一次,所以 因此 這通常比使用單個節點調用100次更高效。

目前(版本0.5.4)的addChild使用此模式:

var prevFlag = tree.enableUpdate(false); 
[modify the tree] 
tree.enableUpdate(prevFlag); 

enableUpdate(真)調用tree.redraw(),所以整個樹被更新。 這將 隨版本1.0變化,但即使如此,它會更快地結合 addChild 調用。

另一方面是:是節點在DOM中創建。 從1.0開始,HTML元素的創建被推遲到節點 變爲 首次可見(展開)。 因此,有可能將大量節點加載到有效的內部Dynatree數據結構中,而不會膨脹DOM。

如果用戶更友好預加載整個樹,或延遲加載的需求 單 分支取決於服務器,網絡和客戶端上。所以這是 總是 基準不同的情況。

+0

感謝您的信息,只需再澄清一下:何時調用.addChild(nodesToAdd),是否也重繪了現有節點?我明白(顯然)nodesToAdd將被渲染,但現有的節點呢。這是否重繪整棵樹? – sarsnake 2010-06-28 17:02:18

+0

我剛剛閱讀你的答案,我收集答案是肯定的:)似乎每次任何節點改變樹被重新繪製。它看起來好像是 var prevFlag =樹。enableUpdate(假); 返回'真',如果任何節點已被改變,這將意味着整個樹將重繪。我的理解是否正確?再次感謝你的時間。 – sarsnake 2010-06-28 17:12:23

+0

enableUpdate(..)返回以前的更新模式。該模式允許恢復以前的狀態(即使在遞歸調用層次結構中)。 由於我們沒有跟蹤修改,所以enableUpdate(true)總是更新整個樹:創建新節點並更新現有類的名稱。 對於v1.0,我可能會更改mynode.addChild(childOrChildList)的實現,以僅重新繪製mynode分支。 – mar10 2010-06-29 06:18:22