さて、今日は、昨日に引き続き、コンテナーについてです。
コンテナーとは何か?
コンテナーは、実は、こいつもコンポーネントです。
「( ̄△ ̄;)エッ・・?」
いや、コンポーネントです。
しかし、コンポーネントと違うところが当然あります。それは、コンテナーは、 中にコンポーネント/コンテナーを入れることができる という点です。
Sencha Ext JSを利用した画面構築は、このコンテナーにコンポーネントやコンテナーを入れていきながら構築していきます。
コンテナーは、Ext.container.Containerクラスを必ず継承しています。
代表的な物として、
- Ext.panel.Panel
- Ext.window.Window
- Ext.tab.Panel
などが、コンテナーです。
アイテム
コンテナーは、中にコンテナーやコンポーネントを入れていくことでUIを構築していくことは、上記で説明しました。 では、早速中にコンテナーやコンポーネントを入れてみましょう。
既に、再三登場している itemsというのが、中に入れるコンテナーやコンポーネントを指定する場所です。
1 2 3 4 5 |
items: [{ .... }, { .... }] |
通常、配列で指定しますが、1つだけ指定する場合、オブジェクトリテラルを直接指定しても構いません。
レイアウト
コンポーネントは、既に説明したようにDIVタグが作られます。アイテムに追加したコンポーネントたちは、そのままでは、ただDIVタグがどんどんっ!と積まれるダケです。
コンテナーには、layoutを指定することができて、中のコンテナーやコンポーネントをどのように配置するかを指定することができます。
1 2 3 |
{ layout: 'anchor' } |
レイアウトについても、種類がたくさんあるので別な回で紹介します。
defaults/detaultType
コンテナーは、ネストすることができます。ネストしたときに、中のitemsに対して、同じ指定が繰り返される場合、毎回指定しないといけません。
1 2 3 4 5 6 7 8 9 10 11 12 |
items: [{ xtype: 'panel' items: [{ name: 'field1', xtype: 'textfield', width: 100 }, { name: 'field2', xtype: 'textfield', width: 100 }] }] |
そこで、使えるのが defaults です!上記で、xtypeとwidthを何回も書いていますが、これをdefaultsに指定することで、繰り返しの指定をできます。
1 2 3 4 5 6 7 8 9 10 11 12 |
items: [{ xtype: 'panel', defaults: { xtype: 'textfield', width: 100 }, items: [{ name: 'field1' }, { name: 'field2' }] }] |
コンテナーには、子供のxtypeが指定されなかった場合、なんのxtypeを使うか?が予め指定されています。これを、defaultTypeといって、これを書き換えると、初期値のxtypeを書き換えることができます。先ほどは、defaultsでxtypeを指定しましたが、これでもOKです。
1 2 3 4 5 6 7 8 9 10 11 12 |
items: [{ xtype: 'panel', defaultType: 'textfield', defaults: { width: 100 }, items: [{ name: 'field1' }, { name: 'field2' }] }] |
デフォルトのxtypeを切り替えたいだけであれば、defaultTypeを指定しましょう。 ちなみに、Ext.panel.panel(xtype: ‘panel’)のdefaultTypeは、’panel’になっているため、特にxtypeを指定しないでネストすると、ドンドンパネルが作られていく仕組みになっています。
豆知識 複雑なレイアウトを行うために、コンテナーをネストしていくことになります。パネルの場合、defaultTypeが’panel’のため、レイアウト用のコンテナーもExt.panel.Panelになります。しかし、レイアウトのためだけに、Ext.panel.Panelほどの多機能なコンテナーを利用する必要はありません。Ext.panel.Panelが1つレンダリングされるだけでそれなりのDIVタグが生成されます。 なので、レイアウト用のコンテナーは、Ext.container.Containerクラスを使いましょう。そうすることで、軽量なコンテナーとして利用することができ、同じレイアウトをExt.panel.Panelで行うよりも高速に動作しますし、ブラウザのリレンダリングに対する負荷も軽減できます。
終わりに
どうでしょうか、UIを作るための鍵となる コンテナーがどんなものか、なんとなく解ってきましたか?実際作ることになる複雑なレイアウトも、このコンテナーのネストを行って、レイアウトを駆使してやっていきます。
レイアウトについても、複数回でやるので是非マスターしてみてください。
次回は、コンポーネント/コンテナーによる操作から再開します。