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