1

ExtJS 4.2.1 でツリーパネルを使用しています。afteritemexpand以前は、ツリーのノードを展開するときに、リスナーを使用して dom 要素に変更を設定していました (クラス名を正確に変更) 。実際、奇数色の葉とは異なる色の偶数インデックスの葉を持つことでした。うまくいきました。興味のある項目の ID を取得して、それらにアクセスし、className を変更します。別のツリーでも同じようにしましたが、問題は、このツリーを作成するときに で展開するexpandAll()ため、リスナーafteritemexpandが呼び出されないことです。これexpandAll()が必要ですが、afteritemexpandリスナーも必要です。このリスナーを使用する理由は、prototype を使用して item.id に簡単にアクセスできるためです afteritemexpand( node, index, item, eOpts )Ext.get(id)この ID を使用して、メソッドで探している要素を取得できます。私はそれを行うことができますafterlayoutリスナーですが、id へのアクセスはそれほど簡単ではないため、むしろしたくありません。loaddom要素がまだ存在しないため、リスナーではできません。

知りたいのですが、ツリーを完全に拡張して、作成したコードを使用するにはどうすればよいafteritemexpandですか?

これが私のリスナーなので、私がやりたいことをよりよく理解できます(実際に'tree-even-node'は、ツリーの偶数の葉のclassNameに追加するだけです)。

listeners: {
                afteritemexpand: function( node, index, item, eOpts ){
                    var domLeaf = Ext.get(item.id).next();

                    for ( var int = 0; int < node.childNodes.length; int++) {
                        if (node.childNodes[int].data.leaf && (int % 2) == 0) {
                                if (ids.indexOf(domLeaf.id) == -1) {
                                    ids[indiceIds] = domLeaf.id;
                                    indiceIds++;
                                }
                        }
                        domLeaf = domLeaf.next();
                    }
                    for ( var int = 0; int < ids.length; int++) {
                        domLeaf = Ext.get(ids[int]);
                        if (domLeaf != null) {
                            for ( var int2 = 0; int2 < domLeaf.dom.children.length; int2++) {
                                if (domLeaf.dom.children[int2].className.search('tree-even-node') == -1){
                                    domLeaf.dom.children[int2].className += ' tree-even-node';
                                }
                            }
                        }
                    }
                }
4

1 に答える 1

1

I finally used both load and afteritemexpand listeners. The loading enables me getting the right ids quite easily and I can set the classNames with afteritemexpand because I know the dom elements are loaded, so I don't get a null with my Ext.get(id). It works great.

Here is the code:

listeners: {
                load: function(node, records, successful, eOpts) {
                    var ownertree = records.store.ownerTree;
                    var boundView = ownertree.dockedItems.items[1].view.id;
                    var generalId = boundView+'-record-';

                    if (!node.tree.root.data.leaf) {
                        // Process each child node
                        node.tree.root.cascadeBy(function(currentChild) {
                            // Process only leaf
                            if (currentChild.data.leaf) {
                                var nodeId = ""+generalId+currentChild.internalId;
                                var index = currentChild.data.index;
                                if ( (index % 2) == 0 && ids.indexOf(nodeId) == -1 ) {
                                    // even nodes
                                    ids[indiceIds] = nodeId;
                                    indiceIds++;
                                } 
                               console.log(ids);
                            }
                        });
                    }
                },
                afteritemexpand: function( node, index, item, eOpts ){
                    for ( var int = 0; int < ids.length; int++) {
                        domLeaf = Ext.get(ids[int]);
                        if (domLeaf != null) {
                            for ( var int2 = 0; int2 < domLeaf.dom.children.length; int2++) {
                                if (domLeaf.dom.children[int2].className.search('tree-even-node') == -1){
                                    domLeaf.dom.children[int2].className += ' tree-even-node';
                                }
                            }
                        }
                    }
                },  
于 2013-07-16T08:11:24.297 に答える