Cairngormをもう少し便利に使う(1.ViewHelper拡張)

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シリーズの後にまとめます。

Category: Flex | Posted on: 2009/04/02 11:27 | Viewed: 1683

Comments

No comments yet

Add Comment

:

:
:

TrackBacks

このエントリにトラックバックはありません

TrackBack URL

http://www.azul.systems-noel.jp/trackback/item_80.html