Flashvars モジュール化
2009年02月21日 16:43
FlashVars は ActionScript 3.0 からオブジェクトとして処理出来るので、汎用的にモデルクラスにオブジェクト突っ込もうと思ってモジュール作成。
色んなやり方があるとは思うけど、FlashVars の可否に関わらず、view で Event を dispatch しておいて、controller がある場合はそれを model クラスルートクラスが格納する仕組み。これだとすべての view クラスが model の参照を持っている前提で必要な時だけすべての view 系のクラスからいつでもオブジェクトを取得出来るので、key(FlashVars の変数名)さえ渡せばどこでも使用出来る。基本の view が dispatch して controller がそれを listen して model を操作っていう MVC パターンでのモジュール化。
サンプルはドキュメントクラス Main でそこで MVC を作成している例。
(CF ってのは convexstyle framework の略なので気にせず!)
package {
public class Main extends CFComponentMC {
import controller.CFController;
import flash.events.Event;
import model.CFModel;
import view.CFView;
import view.events.FlashvarsEvent;
public function Main() {
this.addEventListener(Event.ADDED_TO_STAGE, onInit, false, 0, true);
}
private function onInit(evt:Event):void {
var m:CFModel = new CFModel();
var v:CFView = new CFModel();
var c:CFController = new CFModel();
// この FlashvarsEvent を FlashvarsController が listen している
v.dispatchEvent(new FlashvarsEvent(FlashvarsEvent.SAVE, this.stage.loaderInfo.parameters));
}
}
}
package {
public class FlashvarsController extends CFController {
import controller.CFController;
import view.events.FlashvarsEvent;
public function FlashvarsController() {
super();
this._view.addEventListener(FlashvarsEvent.SAVE, handleFlashVarsSave, false, 0, true);
}
private function handleFlashVarsSave(evt:FlashvarsEvent):void {
this._model.flashvars = evt.flashvars;
}
}
}
個人的にはこのやり方が気持ちいいな。
取得の際は、key(ここでは test)で取得するだけなので、どの View クラスでも気兼ねなく使える。
if(!ObjectUtil.isNull(this._model.flashvars["test"])) {
// do action
}
ちなみに今まで少し曖昧だったのが FlashVars の取得方法。
preloader.swf が main.swf を読み込む場合、よくブログとかには LoaderInfo(this.root.loaderInfo).parameters とか this.root.loaderInfo.parameters とか書いてあるが、上記の図の用に preloader.swf が main.swf を読み込んで main.swf から loaderInfo オブジェクトを取得しようとすると null になる。当然ながら root ってそのコンテンツの表示ツリーのトップを意味するので、ここでは main.swf のトップ。loaderInfo は大元の swf の情報を取得するものなので、今回は表示オブジェクトのルートである preloader.swf の loaderInfo が flashVars を格納するのでずれてしまう。
loaderInfo はもともと DisplayObject のプロパティなので、各 swf に共通でシングルトンである DisplayObject のサブクラスstage オブジェクトの loaderInfo プロパティから取得する形がいいですね。this.stage.loaderInfo.parameters。

CF っていったら ColdFusion だよ、間違いなく。
Posted by タロ | 2009年02月22日 00:07
Posted on 2009年02月22日 00:07