Как удалить узел из Treepanel Ext, если узел не был отображен

StackOverflow https://stackoverflow.com/questions/4854963

  •  27-10-2019
  •  | 
  •  

Вопрос

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

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

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);
}
Это было полезно?

Решение 2

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

Проблема заключалась в том, что по умолчанию TreeLeAder очищает своих детей, когда называется TreeLoader#Reload (его называют 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-rere-doesn-twork&p=567459#post567459

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

Другие советы

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

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

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

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

РЕДАКТИРОВАТЬ: На самом деле, это более интуитивно понятно:

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

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

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

Ура, Роб

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top