Domanda

Ho scoperto che non posso eliminare i nodi che non sono ancora stati resi. Il seguente codice mostra cosa intendo. L'ho eseguito dalla riga di comando di Chrome (e Firebug) http://dev.sencha.com/deploy/dev/exa...dow/hello.html (da quando quella pagina ha ex ext)

Ho digitato ogni istruzione separatamente per assicurarmi che non ci fossero problemi con le operazioni asincroni (anche se i dati dell'albero sono in memoria)

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);

Qualche suggerimento su cosa fare?

RISPONDERE

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);
}
È stato utile?

Soluzione 2

Finalmente l'ho capito, in realtà Condor dal supporto EXT-JS ha capito per me.

Il problema era che, per impostazione predefinita, un TREELAARDER cancella i suoi figli quando viene chiamato Reload#TREELOADER#(è chiamato da AsyncTreENode#Expand (), se l'opzione ClearOnload è vera (impostazione predefinita).

 (TreeLoader) load : function(node, callback, scope){
        if(this.clearOnLoad){
            while(node.firstChild){
                node.removeChild(node.firstChild);
            }
        }
        if(this.doPreload(node)){ // preloaded json children
            this.runCallback(callback, scope || node, [node]);
        }

Quindi creando il mio caricatore di alberi con clearOnLoad: false Risolve il mio problema. Tranne quando rimuovo tutti i nodi figlio. Per risolvere che avevo bisogno della seguente patch:

Ext.tree.TreeLoader.prototype.doPreload = 
Ext.tree.TreeLoader.prototype.doPreload.createSequence(
  function(node){
    if (node.attributes.children)  {
      node.attributes.children = [];    
    }
  }
);

Ecco un link al thread Ext-JS:

http://www.sencha.com/forum/showthread.php?122681-deleting-unrender-nodes-from-a-tree-doesn-t-work&p=567459#post567459

@Pumbaa: questa è una soluzione, piuttosto che una soluzione alternativa come hai suggerito, ma sono davvero grato per il tuo aiuto.

Altri suggerimenti

Ext.tree.treepel è l'unico componente che odio di più (seguito da formpanel).

Ecco cosa succede: il treeloader precarica i nodi figlio del nodo radice dal suo oggetto di configurazione originale, e così fa una chiamata a Asynctreenode.expand, che sostanzialmente ripristinerà l'albero.

Quindi, dovrai rimuovere il nodo dalla configurazione del tuo rootnode in questo modo prima di espanderci:

tree.getRootNode().attributes.children[0].children.shift();

EDIT: In realtà, questo è più intuitivo:

tree.getRootNode().childNodes[0].attributes.children.shift();

(fa la stessa cosa, da allora root.childNodes[0].attributes === root.attributes.children[0])

Fino all'ampliamento del treenode, gli elementi non sono ancora inizializzati come componenti EXTJS. Fino a quel momento sono semplicemente seduti nella matrice di oggetti per bambini (oggetti Javascript standard xtyped) guarda Trenode.ChildNodes nei documenti API. Prova a rimuoverli da quel array e quindi ad espandere l'oggetto. Questo dovrebbe fare il trucco

Saluti, Rob

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top