MXMLコンポーネントをActionscriptで扱う

今回のパターンでは、PresentationをControlが操作する(ただ既述のように基本的に生成時だけ)。
PresentaionはせっかくFlexだからMXMLで定義する。つまりPresentationオブジェクトはMXMLコンポーネントになる(MXMLモジュールは分からないので除外する)。対してControlはActionscriptで記述されたクラスで表す。


すると「ControlがPresentationを操作する」には、ActionscriptMXMLコンポーネントを扱えないといけない。
通常は、MXML内でActionscriptクラスのインスタンスを生成する(Scriptでnewしたり、タグで埋め込むことで(リンク先ではUIComponentを拡張しているがその必要はない。ただFlexBuilderのデザイン画面でControlが使えるようにはなる))。そしてASクラスのインスタンスMXML側からメッセージを送る。


しかしActionscript側からだけでMXMLコンポーネントを扱う必要がある。違う言語で表されたものをどうやって?
Adobeの資料にもMXML側からActionScriptで作られたクラス/コードを利用する例しかない。


実はMXMLコンパイルされてファイル名と同名のASクラスに変換されている。(これはコンパイラに-keepオプションを指定するとgeneratedという中間生成されたファイルが残り、そこを見ると分かる)
そのためView.mxmlを利用するには以下のようにすればいい。

var view:View = new View();

もしView.mxml

コンポーネントを使ってれば、(Contorolにあたる)AS側では

view.dgrid.dataProvider = {col1:"a", col2:"b"};

というようにアクセスできる。
ただし、viweが他のContainerにaddChildされるまではコンポーネントは初期化されてないため、上のコードをaddChildの前に実行するとdgrid==nullでエラーになるのに注意。


ただしFlex Builderで「MXMLアプリケーション」を指定するとMXMLファイルがルートになる。そのためContorol側でPresentationのインスタンスを作るわけにもいかない(もちろん自動生成されたMXMLファイルを使わないという手でもいいが)。
その時はControlのAS内で、ApplicationクラスからPresentationのインスタンスを取得する方法がある。

var view:View = Application.application as View;


コンパイルのオプションに-keepを指定すると-keepオプションはid:secondlifeさんのとこで知った。bindableのすばらしい解説。
http://d.hatena.ne.jp/secondlife/20070326/1174904664