Как удалить узел из Ext TreePanel, если узел не был обработан - PullRequest
2 голосов
/ 31 января 2011

Я обнаружил, что не могу удалить узлы, которые еще не были обработаны.Следующий код показывает, что я имею в виду.Я запустил его из командной строки Chrome (и Firebug) при http://dev.sencha.com/deploy/dev/exa...dow/hello.html (так как на этой странице была предварительно загружена ext)

Я напечатал каждый оператор отдельно, чтобы убедиться в отсутствии проблем с асинхронными операциямидаже если данные дерева находятся в памяти)

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

Есть предложения о том, что делать?

ОТВЕТ

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

Ответы [ 3 ]

3 голосов
/ 01 февраля 2011

Ext.tree.TreePanel - это один компонент, который я больше всего ненавижу (за ним следует FormPanel).

Вот что происходит: TreeLoader предварительно загружает дочерние узлы корневого узла из своего исходного объекта конфигурации, а также вызывает AsyncTreeNode.expand , который в основном сбрасывает дерево.

Итак, перед расширением вам нужно удалить узел из конфигурации вашего корневого узла, как показано ниже:

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

Редактировать: На самом деле, это более интуитивно понятно:

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

(делает то же самое, поскольку root.childNodes[0].attributes === root.attributes.children[0])

1 голос
/ 02 февраля 2011

Я наконец-то понял, на самом деле Condor из поддержки Ext-JS понял это для меня.

Проблема заключалась в том, что по умолчанию TreeLoader очищает своих потомков, когда вызывается перезагрузка TreeLoader # (вызываетсяAsyncTreeNode # expand (), если опция clearOnLoad имеет значение true (по умолчанию).

 (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]);
        }

Поэтому создание загрузчика дерева с clearOnLoad: false решает мою проблему. За исключением случаев удаления всех дочерних узлов. Чтобы исправить этоМне нужен был следующий патч:

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

Вот ссылка на ветку ext-js:

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

@ Pumbaa: Это решение, а неОбходной путь, как вы предложили, но я очень благодарен за вашу помощь.

0 голосов
/ 01 февраля 2011

Пока триод не развернут, элементы еще не инициализированы как компоненты ExtJS.До этого времени они просто сидели в массиве дочерних элементов (стандартные объекты javascript xtyped), просматривая TreeNode.childNodes в документации API.Попробуйте удалить их из этого массива, а затем разверните элемент.Это должно сделать трюк

Ура, Роб

...