2011-01-20 10 views
2

私は以下の状況に直面しています。Extjs3コンポーネント階層 - すべての子コンポーネントをフェッチする

私はこの formpanel内Iはformpanelの一部である に配置されている再度素子を形成 における別のタブパネルを有する、formpanelを有します。 壮大なものはありません。基本的に formpanelで、それぞれ "サブフォーム"が のタブパネルのタブに含まれています。

これで、ユーザーがツールバーのボタンをクリックすると、各サブフォーム/タブを有効または無効にするコードが追加されました。しかし、無効化されたタブ内のすべてのformelementsをスキップする検証のために、私はtabpanel内の各フォームフィールドを個別に無効にする必要があるため、送信時に検証をスキップします。

これは問題が始まるときです。タブ/サブフォームのいずれかに、別のネストされたフィールドセットを持つフィールドセットがあるとします。 タブ/サブフォームに含まれるすべてのxtype:field要素を取得するにはどうすればよいですか?


だから基本的に私は聞いてるのよ私はコンポーネント階層内の深さが何であれ、タブの子コンポーネントであるすべての成分を取り出すことができる方法のですか?私はすべての子コンポーネントを収集するメソッドを持っているだけで、それらをループし、Ext.isXType( 'field')からtrueを返すものを無効にするのは簡単です...しかし、私はすべてのサブコンポーネントを集める方法がわかりませんコンポーネントへの参照が含まれています。

答えて

2

この方法:

var componentsArray = container.findByType('component'); 

あるいはこの

var componentsArray = container.findBy(function(c) {return true}); 

(さらに高速でなければなりません)

bbar、これはtbar内のコンポーネントを返さないよりも、しかし、注意すべきです、buttonsの子孫のExt.Panelのプロパティ。

+0

ドキュメントはこの上の誤解を招くおそれがあります。 「Find ** a ** component ...」と表示されますが、戻り値の型は配列です。あなたはどちらか一方の方法を確認しましたか? – Hemlock

+0

実際にはコンポーネントの配列を返します。それは 'Ext.Container.findBy()'実際には、 'VAR componentsArray = container.findByの結果を返す(関数の(c){trueを返す})、コードを参照して、'も動作するはず:D – Mchl

+1

気にしないで、私はそれが配列を返すことを確認しました。 – Hemlock

1

を編集してください。findByTypeをMchlの回答から使用してください。私は、Extのドキュメンテーションの誤りによって誤解を招いてしまった。


あなたはExt.Container.prototype.cascade

カスケード(関数fn、[対象範囲]、[配列引数])を使用することができます。Ext.Container

カスケードこのからコンポーネント/コンテナ 階層構造ダウン(最初に と呼ばれます)、各コンポーネントに指定された関数 を呼び出します。関数呼び出しのスコープ(this) は、スコープ または現在のコンポーネントになります。関数への の引数は、 argsまたは現在の コンポーネントです。関数がいずれかの時点で falseを返した場合、カスケードはそのブランチで停止した です。この回答をテストしながら、

私はそれがこの方法を使用:

var children = []; 
this.cascade(function(cmp) { 
    if (cmp.isXType('field')) { 
    children.push(cmp) 
    } 
}); 

childrenは446ので、すべてのフィールドのインスタンス異なるレベルを含んでいました。

関連する問題