這是Layke的解決方案(否則工作正常)通過商業網站的預生產測試發現的問題。
案例1:
- 創建&填充樹。
- 單擊要選擇的節點。
- 在Layke的解決方案中執行refreshTree。
- 點擊一個節點,出現錯誤「this.labelNode is undefined」。
現在重新開始,情況2:
- 創建&填充樹。
- 單擊要選擇的節點。
- 按住Ctrl鍵點擊之前選擇的節點。
- 在Layke的解決方案中執行refreshTree。
- 點擊一個節點,沒有錯誤。
存儲的對第一個選擇的選擇引用正在用於在進行第二個選擇時撤消選擇屬性(背景顏色等)。 不幸的是,被引用的對象現在處於比特桶中。修改後的代碼 似乎是生產就緒的,即沒有任何預生產測試失敗。
解決的辦法是把:
之前上述Layke的refreshTree溶液的第一線
Tree.dndController.selectNone();
。
針對元的建議,那就是:
refreshTree : function() {
// Destruct the references to any selected nodes so that
// the refreshed tree will not attempt to unselect destructed nodes
// when a new selection is made.
// These references are contained in Tree.selectedItem,
// Tree.selectedItems, Tree.selectedNode, and Tree.selectedNodes.
Tree.dndController.selectNone();
Tree.model.store.clearOnClose = true;
Tree.model.store.close();
// Completely delete every node from the dijit.Tree
Tree._itemNodesMap = {};
Tree.rootNode.state = "UNCHECKED";
Tree.model.root.children = null;
// Destroy the widget
Tree.rootNode.destroyRecursive();
// Recreate the model, (with the model again)
Tree.model.constructor(dijit.byId("myTree").model)
// Rebuild the tree
Tree.postMixInProperties();
Tree._load();
}
感謝您的回答Laykes。你的腳本確實刷新了樹渲染。但是,在這個例子中,我無法在其上加載新數據。我已經實現了定期刷新,調用你創建的函數。我的商店將url屬性設置爲包含JSON數據的文件名。我正在更改文件上的數據,但樹總是呈現初始數據。你知道如何在其上加載新數據嗎? – Zion 2011-03-25 13:10:33
對不起TheLostGuy,我認爲你的商店設置爲關閉時刷新。添加:dijit.byId(「myTree」)。model.store.clearOnClose = true; – Layke 2011-03-25 15:53:42
非常感謝Laykes。現在這確實對我有用。 乾杯! – Zion 2011-04-01 12:38:46