Cairngormを使う時はViewHelperにロジックを実装していきますが、
Cairngormは汎用的に作られているので、お約束のコーディングが増えてきます。
例えば、Viewに設定した全てのValidatorの実行だったり、
全てのValidatorの検証結果のクリアだったり、
CairngormEventのdispatchだったり、
こういうお約束なコードを全てのViewHelperに実装するのは
コードの量も増えますし、同じようなコードを何度も書くのは、バグの発生率も高まります。
なるべくシンプルな実装のViewHelperを使えるように
ViewHelperを拡張したExtendedViewHelperを考えてみます。
ということで、今delfinoが使っているExtendedViewHelperです。
ViewHelperを実装する場合には、このExtendedViewHelperを拡張して実装しています。
ちなみに、こういうお約束の内容はFlex Builder(というかeclipse)のスニペットに登録しておくと便利です。
以下、ExtendedViewHelperのソースです。
package ${PackageName} { import com.adobe.cairngorm.control.CairngormEvent; import com.adobe.cairngorm.control.CairngormEventDispatcher; import com.adobe.cairngorm.view.ViewHelper; import flash.events.Event; import mx.events.FlexEvent; import mx.events.ValidationResultEvent; import mx.validators.Validator; /** * ExtendedViewHelper * @author $Author$ * */ public class ExtendedViewHelper extends ViewHelper { /** /** * CairngormEventDispatcher */ protected static var dispatcher:CairngormEventDispatcher = CairngormEventDispatcher.getInstance(); /** * ViewLocator */ protected static var locator:ViewLocator = ViewLocator.getInstance(); /** * Validators of ExtendedViewHelper */ protected var validators:Array = new Array(); /** * initialization * @param document view of ViewHelper * @param id id of ViewHelper * */ override public function initialized(document:Object, id:String):void { super.initialized(document, id); this.view.addEventListener(FlexEvent.CREATION_COMPLETE, this.initViewHelper); } /** * Initialize method of ExtendedViewHelper.<br /> * Override this method at sub classes. * @param event Evet * */ protected function initViewHelper(event:Event):void {} /** * Dispatch specified CairngormEvent. * @param cairngormEvent * */ protected function dispatch(cairngormEvent:CairngormEvent):void { dispatcher.dispatchEvent(cairngormEvent); } /** * Validate all Validators * @return validate result * */ protected function validate():Boolean { if(Validator.validateAll(validators).length < 1) { return true; } else { return false; } } /** * Clear all Validation result * */ protected function clearValidators():void { for each(var validator :Validator in this.validators) { validator.dispatchEvent(new ValidationResultEvent(ValidationResultEvent.VALID)); } } } }
少し説明をすると、ViewHelperのinitializedメソッドをオーバライドして、
ViewのCREATION_COMPLETE時にinitViewHelperがコールバックとして呼ばれるように設定しているのと、
ExtendedViewHelperのdispatcherフィールドにCairngormEventDispatcherを設定しています。
initViewHelperはViewのCREATION_COMPLETE時に呼ばれますから、
ここで例えばViewにEventListenerを設定したり、Validatorを設定したりします。
Viewに設定するValidatorは、ExtendedViewHelperのvalidatorsに追加しておくと
validateメソッドやclearValidatorsメソッドの対象にすることができます。
dispatchメソッドは、CairngormEventを発行する際に
CairngormEventDispatcher.getInstance().dispatchEvent(cairngormEvent);
と、いちいち書くのもおっくうなので、
this.dispatch(cairngormEvent);
と手抜きをする為のメソッドです。
毎回インスタンスの取得を行わないだけ、少しクライアントにも優しい部分もあるかもしれません。
validateメソッドは、フィールドvalidatorsに格納されているValidatorの検証を実行します。
ありがちな処理で、OKボタン押下時のコールバックなんかに使います。
private function onOKClick(event:Event):void { if(this.validate()) { //検証がOKなら処理の実行 } }
とか、こんな感じですね。
そして、clearValidatorsメソッドは、
フィールドvalidatorsに格納されているValidatorの検証結果をクリアします。
例えば、何かのVOの編集をする為のViewなんかで、
検証結果が残ったままなのもあれなので、こんな感じに使います。
public function set vo(value:VO):void { this._vo = value; this.clearValidators(); }
と、いうことでまずはViewHelperの拡張クラスについて、でした。
次はこの拡張ViewHelperを使ったViewHelperの実装についての予定です。
その後はCairngormEvent、そしてCommandについて、まとめてまいります。
そして、PureMVCについても、Cairngormシリーズの後にまとめます。