Aquí hay un problema con la solución de Layke (que de lo contrario funciona) encontrada en pruebas de preproducción para un sitio web comercial.
Caso 1:
- Crear & pueblan un árbol.
- Haga clic en un nodo para seleccionar.
- Ejecute refreshTree como en la solución de Layke.
- Haga clic en un nodo, obtenga el error "this.labelNode is undefined".
Ahora empezar de nuevo, el caso 2:
- Crear & pueblan un árbol.
- Haga clic en un nodo para seleccionar.
- Ctrl-clic en el nodo seleccionado previamente.
- Ejecute refreshTree como en la solución de Layke.
- Haga clic en un nodo, sin error.
Las referencias de selección almacenados en la primera selección se utilizan para deshacer los atributos de selección (color de fondo, etc.) cuando se realiza la segunda selección. Desafortunadamente, los objetos referidos están ahora en el cubo de bits. El código modificado parece estar listo para producción, es decir, no ha fallado ninguna prueba previa a la producción.
La solución es poner:
Tree.dndController.selectNone();
antes de la primera línea de solución refreshTree de Layke anteriormente.
En respuesta a las sugerencias del meta, aquí está:
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();
}
Gracias por su respuesta Laykes. Su secuencia de comandos, de hecho, actualiza la representación del árbol. Sin embargo, con este ejemplo no he podido cargar nuevos datos en él. Implementé una actualización periódica llamando a la función que creó. Mi tienda tiene la propiedad url configurada en un nombre de archivo que contiene datos JSON. Estoy cambiando los datos en el archivo, pero el árbol siempre muestra los datos iniciales. ¿Sabes cómo cargar nuevos datos en él? – Zion
Lo siento TheLostGuy, supuse que su tienda está configurada para actualizar al cerrar. Agregue esto: dijit.byId ("myTree"). Model.store.clearOnClose = true; – Layke
Muchas gracias Laykes. Esto de hecho está trabajando para mí ahora. ¡Salud! – Zion