parent するぐらいなら Singleton にしろ
前回のTERACOでmakocheから飛び出た格言
「parent するぐらいなら Singleton にしろ!」
Flashでの話で登場した格言ですが、
ここではCairngormのViewHelperにおいて、同様にparentDocumentを使用しない方法を書いてみます。
■CairngormのViewHelper
CairngormのViewHelperでは、ViewStackの切替えなどで、親コンポーネントの要素へアクセスする必要が出た際、
「view.parentDocument.id名」と記述する必要があります。
もうひとつ親のmxmlまで遡るなら「view.parentDocument.parentDocument.id名」。
これでは、
mxmlの親子関係を簡単に変更する事ができず、メンテナンス性が落ち、makocheの名言から学習していない事になります。
■対策案
そこで、ViewHelperのprotectedプロパティであるview:Objectを、他のViewHelperからアクセス可能にするために、
以下のようなサブクラスを作成します。
import com.adobe.cairngorm.view.ViewHelper; public class ViewHelperEx extends ViewHelper { public function get viewObj():Object{ return super.view; } }
はい。
一応、getterしか作りません。(Read Only)
で、このクラスを継承して各ViewHelperクラスを作成するルールにします。
public class FooViewHelper extends ViewHelperEx ・・・
ViewLocatorには全てのViewHelperインスタンスがDictionaryに格納されていますので、
ViewLocatorを使用して、他のViewHelper.viewにアクセスすることが出来るようになります。
・・・(ViewHelperクラスにて)・・・ // アクセスしたいmxmlのHelperインスタンスを取得する var barHelper : BarViewHelper = ViewLocator.getInstance().getViewHelper("取得したいViewHelperインスタンス名") as BarViewHelper; // 例えばviewStackを切り替える barHelper.viewObj.vStack.selectedChild = barHelper.viewObj.xxxxx; ・・・
■ViewLocatorを使う
これで、作成したコンポーネントのDOMツリーを意識しなくてよくなり、
画面周りとスクリプトをすこし疎な結合にする事が出来ました。
ViewLocatorは、ViewHelperのインスタンスを全て持っています。
また、mxml同士の相対的な位置関係を意識する事無くアクセスできますので、
どんどん有効活用すればいいと思います。