Вот проблема с решением Layke (которое в противном случае работает), найденным при предварительном тестировании для коммерческого сайта.
Дело 1:
- Создание и заполнение дерева.
- Нажмите на узел, чтобы выбрать.
- Выполните refreshTree, как в решении Layke.
- Нажмите на узел, получите ошибку «this.labelNode не определен».
Теперь начнем снова, случай 2:
- Создать и заполнить дерево.
- Нажмите на узел, чтобы выбрать.
- Ctrl-клик по ранее выбранному узлу.
- Выполните refreshTree, как в решении Layke.
- Нажмите на узел, без ошибок.
Сохраненные ссылки выбора для первого выбора используются для отмены
атрибуты выбора (цвет фона и т. д.) при втором выборе.
К сожалению, упомянутые объекты теперь находятся в ведре битов. Модифицированный код
похоже, что он готов к производству, т. е. не прошел предварительных испытаний.
Решение поставить:
Tree.dndController.selectNone();
до первой строки решения Layke's refreshTree, описанного выше.
В ответ на мета-предложения вот оно:
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();
}