Comment faire pour supprimer un nœud à partir d'un Poste TreePanel si le nœud n'a pas été rendu
J'ai constaté que je ne peux pas supprimer les nœuds qui n'ont pas été rendus encore. Le code suivant montre ce que je veux dire. J'ai couru à partir du Chrome (et de Firebug) de la ligne de commande alors que sur http://dev.sencha.com/deploy/dev/exa...dow/hello.html (depuis cette page a ext préchargé)
J'ai tapé chaque état séparément pour s'assurer il n'y a pas de problèmes avec les opérations asynchrones (même si l'arbre de données est en mémoire)
Ext.getBody.update('');
//Tree with preloaded nodes in memory
var tree = new Ext.tree.TreePanel({
renderTo: Ext.getBody(),
width: 300,
height: 500,
rootVisible: false,
loader: new Ext.tree.TreeLoader({preloadChildren:true}),
root: new Ext.tree.AsyncTreeNode({
expandend: true,
children: [
{text: 'Folder 1', id: 'folder1', leaf: false, children: [
{text: 'File 1', id: 'file1', leaf: true},
{text: 'File 2', id: 'file2', leaf: true}
]}
]
})
});
//Try to delete 'File 1', notice that the folder has never been expanded
tree.getRootNode().childNodes[0].childNodes[0].remove(true);
//Expand the node and see that 'File 1' is still there
tree.getRootNode().childNodes[0].expand();
//Delete the first child 1 again, it works now that it's been rendered
tree.getRootNode().childNodes[0].childNodes[0].remove(true);
Des suggestions sur ce qu'il faut faire?
RÉPONSE
var nodeToRemove = tree.getRootNode().childNodes[0].childNodes[0];
if (!nodeToRemove.rendered) {
var children = node.parentNode.attributes.children;
Ext.each(children, function(child, index){
if (child.id == nodeToRemove.id) {
chilren.splice(index, 1);
return false;
}
}) ;
} else {
nodeToRemove.remove(true);
}
- Pourquoi inclure des noeuds si vous voulez les supprimer de toute façon?
- Ce n'est évidemment pas le code utilisé, c'est juste une réduction. L'arbre est une vue de données, à d'autres endroits dans le code peut supprimer les fichiers", avant de leur "dossier" est développée dans l'arbre.
Vous devez vous connecter pour publier un commentaire.
Ext.d'arbre en arbre.TreePanel est le seul composant que je déteste le plus, suivie par FormPanel).
Voici ce qui se passe: Le TreeLoader met le nœud racine de l'enfant, les nœuds de sa config d'origine de l'objet, et ne fait donc un appel à AsyncTreeNode.développez, qui sera essentiellement de réinitialisation de l'arbre.
Donc, tu vas avoir à retirer le nœud de votre rootNode de config comme ça avant de s'étendre:
Edit: en Fait, c'est plus intuitif:
(fait la même chose, depuis
root.childNodes[0].attributes === root.attributes.children[0]
)Folder 1
n'est pas signalé chargé, donc une fois que vous appelezexpand()
, le chargeur saute à nouveau.J'ai enfin compris, en fait Condor de Ext-JS soutien pensé à elle pour moi.
Le problème est que par défaut, un TreeLoader efface ses enfants quand TreeLoader#reload est appelé (il est appelé par les AsyncTreeNode#développer(), si le clearOnLoad option est à true (par défaut).
À la création de mon arbre chargeur avec
clearOnLoad: false
résout mon problème. Sauf que quand j'ai enlever tous les nœuds enfants. Pour corriger cela j'ai besoin du patch suivant:Voici un lien vers l'ext-js fil:
http://www.sencha.com/forum/showthread.php?122681-Deleting-unrendered-nodes-from-a-tree-doesn-t-work&p=567459#post567459
@Pumbaa: C'est une solution, plutôt que d'une solution de contournement, comme vous l'avez suggéré, mais je suis très reconnaissante pour votre aide.
Jusqu'à ce que le treenode est élargi, les éléments ne sont pas encore initialisé comme ExtJS composants. Jusqu'à ce moment, ils sont tout simplement assis dans le tableau des éléments enfants (xtyped standard des objets javascript) regardez TreeNode.childNodes dans les docs de l'API. Essayez de les retirer du tableau, puis l'expansion de l'élément. Cela devrait faire l'affaire
Cheers,
Rob