2011-01-31 41 views
2

我發現我無法刪除尚未呈現的節點。以下代碼顯示了我的意思。我從Chrome的(和Firebug的)命令行運行它,而在http://dev.sencha.com/deploy/dev/exa...dow/hello.html(因爲該頁面已經預加載)如何從Ext TreePanel中刪除節點(如果該節點尚未呈現)

我分別鍵入每個語句以確保異步操作沒有問題(即使樹數據處於內存)

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

任何建議怎麼做?

ANSWER

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

爲什麼包含節點,如果你想刪除它們呢? – Chandu 2011-01-31 19:14:07

+0

@Cyber​​mate:這顯然不是實際使用的代碼,它只是一個縮減。樹是數據的一個視圖,代碼中的其他位置可能會在樹的「文件夾」展開之前刪除「文件」。 – 2011-01-31 19:20:49

回答

1

我終於搞明白了,其實Co來自Ext-JS支持的ndor爲我解決了這個問題。

的問題是,在默認情況下,一個TreeLoader清除其兒童在TreeLoader#重載被稱爲(它是由AsyncTreeNode#稱爲擴展(),如果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:這是一個解決方案,而不是如你所說一種解決方法,但我對你的幫助真的很感謝。

-1

直到樹節點展開,項目尚未初始化爲ExtJS的組件。在那之前,他們只是坐在兒童項目數組(xtyped標準JavaScript對象)中查看API文檔中的TreeNode.childNodes。嘗試從該數組中刪除它們,然後展開該項目。這應該做的伎倆

乾杯, 羅布

+0

對不起,這是完全不正確的。 – user123444555621 2011-01-31 23:44:57

3

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]