2011-12-06 10 views
2

特定のHTML要素の子孫としてレンダリングされるすべてのExtJSコンポーネントを見つける最も効率的な方法は何でしょうか?この要素はコンポーネント自体の一部ではなく、Extによって何らかの形で管理されているわけではなく、ハードコードされた生のHTMLです。また、この要素にはextコンポーネントのみが含まれているだけでなく、他の非ext管理HTMLも含まれている可能性があります。また、htmlにはextコンポーネントも含まれています。したがって、ソリューションは、直接の子どもを見るだけでなく、DOMの下を横切る必要があります。ExtJS 4 - 指定された要素の子孫であるすべてのコンポーネントを取得する

答えて

2

私の提案は、各要素のIDをExt.getCmp(ハッシュマップルックアップ)と照らし合わせて調べることです。その後、Component方法を歩いに切り替えることもできますが、私はそれは基本的に同じ速度になると思います、あなたはすでにあなたと一緒に開始するためにDOMを歩いているかのようにもそれを維持することがあります

var dom = ...; 
var components = []; 
Ext.Array.each(Ext.get(dom).query('*'), function(dom) { 
    var cmp = Ext.getCmp(dom.id); 
    if (cmp) 
    components.push(cmp); 
}); 

Ext.get(dom).query('*')あなたが希望よりも、あなた自身の歩行器を持っている方が効率的かもしれない多くの作業を行うことができ、このように:

function walk(dom, callback) { 
    if (dom.nodeType === 1) { 
    callback(dom); 
    Ext.Array.each(dom.childNodes, function(child) { 
     walk(child, callback); 
    }); 
    } 
} 
var dom = ...; 
var components = []; 
walk(dom, function(dom) { 
    var cmp = Ext.getCmp(dom.id); 
    if (cmp) 
    components.push(cmp); 
}); 

このすべては、DOM IDがあれば、私は知らないコンポーネントのIDを、一致していることを前提としていこれはExtの将来のバージョンで頼りになるものです。

+0

ドームIDがコンポーネントIDと一致していることは間違いありませんが、他のすべての問題があると変更した場合でもそうです。 私はこれについてもう少し考えていましたが、Ext.ComponentManager.allをループし、 'Ext.Element.contains()'を使って考えていました。[link](http://docs.sencha.com/ext- js/4-0 /#!/ api/Ext.Element-method-contains)を使用して、各コンポーネントの '.getEl()'結果が指定された要素に含まれているかどうかを確認します。この方法はあなたが提案したものより効率が悪いですか? –

+1

効率は異なるでしょう。必ずしも悪くはないが、おそらく悪化する。各コンポーネントについて、いくつかの要素をループします。 DOMツリーの深さがMであり、コンポーネントの数がNであれば、O(M * N)のようなものです。私が提案した方法はO(X)のようなもので、XはDOM要素の数です。どちらの方法をより高速化するのが一般的ではありませんが、(a)Extがページの投稿を管理していて、(b)ページに多くの要素がある場合は、dom walkがおそらくもっと速くなる。 –

+0

意味があります、助けてくれてありがとう! –

関連する問題