6. フレームワーク機能詳細
以下、今回紹介するフレームワーク機能について、もう少し詳細に解説します。記事に全ソースコードが添付されていますので、より詳しくはソースコードをご確認ください。
1. Control部品の拡張
前述のように、機能のほとんどはValidateManagerというシングルトンのクラスが行っています。別オブジェクトを生成しなければならなかったところは、各入力部品の拡張機能に隠蔽されています。その各入力部品も、アクセサを追加しただけで、アクセサへの値代入のタイミングで、ValidateMangerにvalidate登録を投げているだけです。
2. validatorsListへの格納
ValidateManagerはvalidatorsListを持っていて、そこに全Validatorオブジェクトを格納しています。ただし、このvalidatesListに格納されたタイミングでは、各validatorはenable=falseの状態となっています。これがenable=trueだと、valueCommitイベントで稼働してしまい、画面の最後でのValidate実行ができなくなっています。
3. 最初のvalidate処理の実行
画面の最後でのValidate実行は、単純にValidateMangerにセットされているリスナーから行われます。イベントが発生すると、validatesListに格納されている各validatorを取り出して、validateを行います。さらにenable=trueとして、次からはvalueCommitイベントでvalidateが稼働するようにしています。
また、最初のvalidate処理が稼働した後にvalidatesListにvalidatorが追加される場合は、(2)で述べたようにenable=falseとするのではなく、enable=trueとしています。この処理の切り分けを行うために、triggerDispatchedListを用意して、triggerが稼働したタイミングで登録するようにしています。
4. Validate結果の制御
(3)により、validateが稼働すると、validatorはValidationResultEventを発行します。これはvalidationResultHandlerに集約されます。結果がinvalidの場合、ErrorModelオブジェクトを生成して、それをerrorListに格納します。errorListを画面上のデータグリッドに関連付ければエラー表示が可能です。このErrorModelオブジェクト生成の際に、該当入力部品の直上にあるFormItem部品を探して、そのlabelプロパティを取得してErrorModelオブジェクトに格納しています。これはエラーリストにエラーを表示した際に、どの部品かをユーザーが分かりやすくするために論理IDとして取得しているものです。今回はForm部品を使っていることを前提にしていますが、必須アスタリスク表示をしたり、レイアウトをある程度自動で決めてくれたりと、便利ですのでぜひ利用をお勧めします。
エラーリストを格納した後、すべてのValidatorのイベントが帰ってきたかどうかを確認してイベントを発行しています。ALLVALIDイベントは、すべてのValidateが成功だった時に発行し、INVALIDイベントは一つでもエラーがあった場合に発行しています。
5. Alertをポップアップ
INVALIDエラーが発生した場合、AlertをPopUpさせます。エラーのたびにAlertを出していては邪魔なので、フラグを使って一回しかでないように制御しています。
6. Validate設定のクリア処理
最後にクリア処理について説明します。クリア処理は、Triggerが稼働してない最初の状態に戻す処理を行っています。例えば、2つ画面があって、2つ目の画面の登録途中、前の画面の登録を見直したくなった場合、ユーザーは前の画面に戻りますが、そのあと、再度2つ目の画面に遷移した際に、初期状態に戻しておくという処理です。
この処理は、clearValidateにて実装していますが、validationListの各validatorをenable=falseにしており、triggerDispatchedListから履歴を削除し、errorListを空にしています。
7. まとめ
Flexは、Flashがもともとはアニメーション作成用のアプリケーションだったこともあって、コンシューマ向けのサイトやアプリケーションなどの用途が主に語られています。しかしこのように通常の業務画面であっても、奇をてらわずに、RIAならではの特徴を存分に生かした画面作成ができます。
単純な入力・出力だけのWeb画面であれば、RIAの必要はないという風潮がありますが、私は必ずしもそうは思いません。そうした画面であっても、RIAの恩恵を大きく受ける機能を実装できるのでぜひ試してみてください。そして、その際には実装をより簡単に、かつ直観的にできるような機能の整理や、共通機能・フレームワーク機能を用意して、生産性を向上させることにチャレンジしてみてください。

