Ext 2.0 にようこそ ここではExt 2.0 のすべての新たな大きな変更点について触れます。どんな新しい機能があってそれを使って何をできるのか、大枠が理解できるかと思います。 しかし概説(Overview)ということですので、このガイドでは皆さんが実際にご自身のExt 2.0アプリケーション作成に着手する上で必要な詳細については多く触れません。より詳しい情報を知りたい方には以下資料が役立つはずです。
| Summary: Ext 1.x と 2.0での主な変更点に関する紹介 |
| Author: Brian Moeskau (訳:Akio SHIMONO) |
| Published: November 15, 2007 |
| Ext Version: 2.0 |
Languages: English Chinese Japanese
|
2.0の新しくなった点の概要は以下のとおりです。但し注意してください。1.xから2.0ではフレームワーク全体として無数の細かい改善やバグ修正などが入っています。その全てをリストにするのは不可能なので、こちらの概要ではアーキテクチャが変更になった分野や、全く新しい機能が加わった分野など、変更のあった主要な分野に焦点を当てています。それぞれの項目についての詳細な説明については、この概要の後の説で触れます。
2.0でのひとつの目標として、以前よりもさらに基礎的な構成ブロックを提供することがありました。Component クラスはもとももと1.xで導入されましたが、 フレームワーク全体を通して完全に統一性のとれたものではありませんでした。2.0でComponentの能力は遥かに拡大・改良され、結果としてアーキテクチャ全体でも最も基礎となるクラスのひとつとなっています。Componentは部品の生成、描画、イベントハンドリング、状態管理、破棄にわたって統一的なモデルを提供し、これら特性を必要とするすべてのExt部品はComponentを継承するようになっています。2.0でのComponentの鍵となる特長は以下のとおりです:
一般的にいえば、2.0のComponentアーキテクチャは"普通に動き"ます。殆どの部品(component)管理を末端開発者には透過的に扱えるよう設計されています。しかし、何かをカスタマイズしたりComponentを拡張する必要が出てくる時がきっと来ます。それがComponenetのライフサイクルの完全な理解が役に立つ時です。Componentを基にした全てのクラスのライフサイクルにおける最も重要な局面は以下のとおりです:
2.0の新しい概念としてxtypes(Ext固有部品type)が挙げられます。使用可能な xtypesの一覧が Component クラス APIのヘッダ部に要約してあります。 xTypes は普通のJavaScript object typeと似た感じで使うことができ、isXType や getXTypeといったメソッドを使って部品の種類を調べたり比較したりすることがきます。また getXTypesを使って任意のComponentのxtype階層を一覧することもできます。
しかしXTypeの本当の力は、Componentの作成と描画を最適化するのに使われる「方法」のところにあります。どんなComponentでもxtypeを特定した設定オブジェクトとしてこれを、実際にオブジェクトとしてインスタンス化することなく、それを宣言して描画パイプラインに渡す形で暗黙的に生成することができます。描画を遅らせるだけでなく、オブジェクト自体が実際に生成されるタイミングも遅らせられるため、Componentが実際に必要となるまでメモリとリソースの消費を抑えることができます。多数のComponentを包含した複雑でネストされたレイアウトでは、これはなかなかの性能改善となります。
//包含された部品を明示的に作成: var panel = new Ext.Panel({ ... items: [ new Ext.Button({ text: 'OK' }) ] }; //xtypeを使って暗黙的に作成: var panel = new Ext.Panel({ ... items: [{ xtype: 'button', text: 'OK' }] };
最初の例では、常にボタンはパネルが初期化される間に直ちに生成されます。Componentをたくさん使う場合は、このアプローチでは潜在的にページ描画を遅くさせてしまいます。 二つ目の例では、パネルがブラウザに実際に表示されるまではボタンは生成も描画もされません。もしパネルが表示されない場合(例えば、隠されたままのタブなど)ボタンは決して作成されず、いかなるリソースも決して消費しません。
2.0での新しい話ではないですが、BoxComponent は、Componentを拡張したこれまた重要な基礎クラスで、これは視覚的に描画されてレイアウトに参加するあらゆる部品(component)に対して、整合性の取れたクロスブラウザのボックスモデル実装を提供するものです。BoxComponent は透過的にサイズ・位置を扱い、自動的にpadding、margin、borderのブラウザ固有の違いを処理して、全てのサポートブラウザ間で整合性の取れたボックスモデルを実現しています。2.0では全てのContainerクラスはBoxComponentを継承しています。
Container は他の部品(Component)を格納するあらゆる部品の最も基本的な基礎となるもので、レイアウトと他部品のネストやサイズ調整を扱うのに必要な描画ロジックを提供します。また、整合性をもってContainerに部品を追加ための基本的なメカニズムも提供します。Containerクラスは決して直接的に使う必要はなく、全ての視覚的なコンテナ部品の基底クラスとして意図されたものです。
Panel は2.0ではとても働き者なcontainerで、おそらくあなたがしたいレイアウト作業の90%で使うものとなるでしょう。その最も基本にあるのは、レイアウトを構築するにあたって、Panelが完全に非視覚的な箱として振舞うことができることです。しかし一方で、PanelはアプリUIウインドウの基本的な構成要素を提供するという側面もあります。その中には、ツールバーやメニューを追加するための上下のバーや、ヘッダ・フッタ・本体といったものも含まれます。また、Panelは開いたり閉じたりするビルトインの振る舞いやツールボタン、また他の多様なツールのためのあらかじめ組み込まれたボタン群も提供します。PanelはあらゆるContainerまたはlayoutの中に簡単にドロップすることができ、そのときのレイアウトや描画ロジックは完全にExtが管理します。
以下の Panel サブクラスは Ext 2.0の主要なWidgetです:
Window は、フロートさせたり、最大化/最小化したり、復元したり、ドラッグしたり、とできるよう機能特化したパネルです。これは、Ext Desktop Demo.にみられるようなデスクトップ風ウィンドウアプリケーションUIの基礎クラスとして使ってもらうことを意図しています。
Viewport はdocument bodyを自動的にレンダーして、自分自身をブラウザのviewportの大きさに合わせるユーティリティContainerクラスです。ブラウザのリサイズやレイアウト再計算を自動でやってくれるので、全画面アプリケーションを作る際の便利なショートカットとなります。ただし注意してください。Viewportオブジェクトはdocument.body以外のいかなるcontainerにもレンダーできませんし、それゆえ1ページに1つのインスタンスしか使うことはできません。
1.x のBorderLayoutは魅力的なUIを極めて簡単に作成することを可能としていた一方、真にカスタマイズされたレイアウトを作成することを可能にするのに充分な構成要素を提供はしていませんでした。複雑なレイアウトの作成にはスクロールバーやネストの問題、その他変わった振る舞いなどを巧く扱うため手作りのコーディングが必要でした。
Ext 2.0 では完全に見直されたエンタプライズレベルのレイアウト管理システムを実現しました。10個の分離したレイアウトマネージャが、殆どどんなスタイルのアプリケーションレイアウトでも作れる基礎を提供するようになりました。また、サイズや位置、スクロールその他属性が何も設定せずにすぐに普通に期待されたとおり動くよう、レイアウトはExtで管理されています。互いに異なるレイアウトを持った、異なる種類のコンテナを組み合わせたり、好きなだけネストさせるようなことも簡単です。
Layoutは new キーワードで直接作るように意図されたものではありません。レイアウトはContainerクラスによって内部的に生成され使われるものです。すべてのContainerはそれ自身レイアウトのことは何も知りません。Containerは単に設定時に特定された何がしかのレイアウトクラスにレイアウトの仕事を移譲します。Containerをつくるときはどんなときでも、そのレイアウトスタイルを決めることができ、またその対応するレイアウトクラスに設定できるオプションをlayoutConfig属性を通じて設定できます。例えば:
var panel = new Panel({ title: 'My Accordion', layout: 'accordion', // このパネルで使うレイアウトスタイル layoutConfig: { animate: true // このレイアウト専用の設定値をここに書く } // 追加の Panel オプション... });
またこれを理解しておくことも重要です。ネストしたレイアウトをつくるとき、パネルが他のPanelを包含していたとしたら、そのレイアウトの中の全てのPanelにレイアウトを指定しておく必要があります。'border'や'accordion'のような特別なレイアウトを必要としないようなときは、ほとんどの場合たぶん'fit'を指定すればいいでしょう。なぜなら、'fit'でもPanelとしての基本的なサイズ調整管理をコンテナとの間でしてくれるからです。もしレイアウトを指定しないと、それでもアプリケーションが動くようデフォルトのContainerLayoutクラスが設定されます。しかし、実際のほとんどのケースでは、明示的なレイアウトなしでは結果としての振る舞いは期待したものと異なるもとのなってしまうでしょう。
各種レイアウトクラスは、それぞれそれ自身に特化した設定オプションをサポートしています。詳しくはAPI docsを参照してください。
![]() |
ContainerLayout他の全てのレイアウトマネージャの基底クラスで、特にレイアウトが定義されなかったときのcontainerオブジェクトのデフォルトレイアウトとなるものです。ContainerLayoutは視覚表現をまったく持ちません。即ち単に包含されたitem群を管理し、必要に応じてそれらを描画したりリサイズバッファリングなどの基本的な作業をこなすだけです。ContainerLayoutは一般的には直接作成されるべきものではありませんが、カスタムのレイアウトを作成する場合はこのクラスを拡張して使うこともできます。 API referenceをご覧ください。 |
![]() |
CardLayoutCardLayoutは、あるコンテナが複数の要素を保持しているものの、常にただひとつだけの要素が見えるような場合に使うためのレイアウトです。よく使われるケースとしては、ウィザードやカスタムでのタブの実装、ないし複数の相互排他的なページから成る情報表示が必要なケースが挙げられます。 API referenceをご覧ください。 |
![]() |
AbsoluteLayoutコンテナからの相対X/Y座標を通じて、包含された部品群を正確に配置することができるとてもシンプルなレイアウトです。 API referenceをご覧ください。 |
![]() |
ColumnLayoutマルチカラムフォーマットで構造的なレイアウトを作成するための選択肢となるフォーマットです。即ち、それぞれの列の幅がパーセントまたはピクセル単位で指定できる一方、高さは内容に応じて変化することが許されます。API referenceをご覧ください。 |
![]() |
AccordionLayoutAccordionLayoutは、内容表示のために開いたり閉じたりするパネルを垂直に積み上げたセットを包含します。一度に開くことができるパネルはただひとつです。 API referenceをご覧ください。 |
![]() |
FitLayout単一の部品を、コンテナの大きさにぴったり正確にフィットさせるシンプルなレイアウトスタイルです。他に特に必要なレイアウトスタイルがない場合、FitLayoutはたいていコンテナの中で使うのにデフォルトとしてもっとも適したレイアウトです。 API referenceをご覧ください。 |
![]() |
AnchorLayoutこのレイアウトはコンテナの両側の縁(へり)から相対的に要素をアンカーするためのものです。アンカーする要素はパーセント比率か両縁からのオフセット値でアンカーすることができます。また実際のコンテナとは異なるサイズの仮想的なレイアウトキャンバスも実現することができます。 API referenceをご覧ください。 |
![]() |
FormLayoutFormLayout は、特にデータ入力フォームを作るために設計されたユーティリティレイアウトです。特に注意すべきなのは、一般的には、普通のPanelに layout:'form'と指定したものよりは、おそらくFormPanelを使うのがよいということです。なぜなら、FormPanelであれば自動的にフォーム提出を扱う部分も提供するためです。FormPanelはlayout:'form'を使わなくてはならず(これは変更不可能です)追加的なレイアウトスタイルが必要なフォームをつくるときは、ネストしたPanelを用いる必要があります。 API referenceをご覧ください。 |
![]() |
BorderLayoutこれは、1.xでのBorderLayoutとまったく同じもので、レイアウト領域はネストやパネルのスライド(開いているものも閉じているものも)、それに、領域を隔離するスプリッタをビルトインでサポートします。典型的なビジネスアプリでの主要なUIを担う最も広く使われるレイアウトスタイルです。 API referenceをご覧ください。 |
![]() |
TableLayoutこのレイアウトスタイルは列と行をまたがることができる標準のHTMLテーブル表記を生成します。 API referenceをご覧ください。 |
グリッドUIは実際にはGridViewクラスで実装されており2.0でGridViewは大きく改良されました。2.0のGridViewに含まれる主要な新しい特長は以下のとおりです:
Ext 1.xで導入された列ロック機能が2.0でなくなり、サポートされなくなったことに気づく方もいるかも知れません。列ロックは一部の少数のユーザには役に立っていましたが、2.0のGridViewで実装された新しい機能の多く(例えばグルーピング、サマリ等)と互換性がなく、またロックをサポートするために必要なグリッド描画の方法が原因で(皆さんが求める)性能を劣化させてしまっていました。1.xのGridViewを2.0に移植したり、パッチで2.0のGridViewに列ロックをサポートさせたりすることも出来るかもしれませんが、Extチームが公式にこれを行うことはありません。
注: 現在コミュニティで列ロックを2.0向けユーザ拡張として実装する努力が進行中であり、本稿執筆時点においてすでにかなり期待できる状態に見えます。詳細はフォーラムスレッドで確認いただけます。
複雑なデータ構造を使った極めて堅牢なテンプレート処理をサポートするため、XTemplate は多様な組み込みのタグや特別な演算子を提供します。以下はサポートされる特長の大まかな一覧です。完全な詳細と利用例については、 XTemplate API docsを参照してください。
DataView は表面上は1.1のViewクラスにとても似たものです。どちらもテンプレート化したデータ描画をサポートし、どちらもデータストアに紐づき、またどちらも組み込みの選択モデルとイベント群を持っています。しかしDataViewは新しい2.0アーキテクチャのパワーの全てを活かせる点で大きな前進といえます。最も重要な変更は以下のとおり:
2.0では、いくつかの面白い新しい部品やウィジェットが追加されました。 それぞれの部品で何ができるのか、完全な詳細についてはAPIドキュメントをご覧ください。
Actionは特定の部品から抽象化されうる再利用可能な機能の断片です。Actionを使うことでハンドラや設定オプションやUI更新をActionインターフェースをサポートするいかなるとも共有するこおとができます。(主にToolbar, Button, Menu 部品など)API Referenceをご覧ください。
これはCheckItem要素群からなるメニューを一つ包含する特別なSplitButtonの実装です。ボタンはクリックでそれぞれのメニュー項目を自動的にまわり、アクティブなメニュー項目に対してボタンのchangeイベントを発生させます。(また提供されていれば、ボタンのchangeHandler関数を呼び出します)FeedViewerデモアプリケーションの中で実例をご覧になれます。プレビューウィンドウの位置を指定するボタンがCycleButtonです。 API リファレンス
シンプルに、標準のHTML hidden 入力フィールドとしてレンダされる便利なフィールドです。 これはフォームで送信するhidden値を格納するのにとても便利で、2.0では、hiddenフィールドも他のExtフォーム部品と同様に生成したり操作することができるようになっています。 API リファレンスをご覧ください。
1.xでも簡単なMessageBoxクラスの中にシンプルなプログレスバーが実装されていました。今回プログレスバーは独立したウィジェットに分離され、はるかに改良されました。 ProgressBarは2つの異なるモード(手動と自動)をサポートし、そのルック&フィールは簡単にカスタマイズできます。API リファレンスをご覧ください。
シンプルな time picker ドロップダウン実装です。 API Referenceをご覧ください。