2

まだレンダリングされていないノードを削除できないことがわかりました。次のコードは、私が何を意味するかを示しています。http://dev.sencha.com/deploy/dev/exa...dow/hello.htmlにいる間にChrome(およびFirebug)のコマンドラインから実行しました(そのページには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);
}
4

3 に答える 3

3

Ext.tree.TreePanelは、私が最も嫌うコンポーネントの1つです(FormPanelがそれに続きます)。

TreeLoaderは、ルートノードの子ノードを元の構成オブジェクトからプリロードします。AsyncTreeNode.expandを呼び出すと、基本的にツリーがリセットされます。

したがって、展開する前に、次のようにrootNodeの構成からノードを削除する必要があります。

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

編集:実際には、これはより直感的です:

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

(以来、同じことをしますroot.childNodes[0].attributes === root.attributes.children[0]

于 2011-01-31T23:44:08.830 に答える
1

私はついにそれを理解しました、実際にExt-JSサポートからのコンドルは私のためにそれを理解しました。

問題は、デフォルトでは、TreeLoader#reloadが呼び出されたときにTreeLoaderが子をクリアすることでした(clearOnLoadオプションがtrue(デフォルト)の場合、AsyncTreeNode#expand()によって呼び出されます)。

 (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:これは、あなたが提案した回避策ではなく、解決策ですが、私はあなたの助けに本当に感謝しています。

于 2011-02-02T18:33:34.157 に答える
-1

ツリーノードが展開されるまで、アイテムはまだExtJSコンポーネントとして初期化されていません。その時まで、彼らは子アイテム(xtyped標準のjavascriptオブジェクト)の配列に座っているだけで、APIドキュメントのTreeNode.childNodesを見てください。それらをその配列から削除してから、アイテムを展開してみてください。それはトリックを行う必要があります

乾杯、ロブ

于 2011-01-31T23:24:42.087 に答える