任意の入力項目の繰り返し
DataGridやListのCellに複数の入力系コンポーネントを貼り付けたくなることがあるでしょう。しかし、これは、うまくいきません。List系コンポーネントは、CellRendererでタブを扱えないからです。
Macromediaに聞いたら仕様だそうです。まぁ、そういってくると思ってました。Flashもそうですから。
Repeaterを使うと、きちんとタブの制御も出来るのですが、コンポーネントの数が増えると遅くなります。環境にもよりますが、20件を越えるとちょっと耐えられなくなってきます。
Flexで親のコンポーネントに子供のコンポーネントを追加するには、createClassObject()を使います。createClassObject()は内部でattachMovie()を呼んでます。
このメソッドを使ってシンプルなRepeaterを自分で作ってみました。すると、繰り返す部分は確かにはやくなったのですが、タブの移動はもっさりして使い物になりません(100件で試しました)。
ということは、今のFlashPlayerでは、入力系のコンポーネントの数が増えるとかなり遅くなるということです。念のためにいっておくと表示だけの場合は、件数が多くても全然平気です。なぜなら、表示用のコンポーネントは、たくさん作る必要がなく、同じ物を使いまわせるからです。
この問題は、FlashのCellRendererがRedererとEditorを兼用しているところに原因があると思います。表示は、Rendererを使いまわし、ダブルクリックしたら1つのCellEditorを呼び出すようにしてくれれば解決するのですけど。
じゃ、あきらめる?そんなことは許されません。
現状での対応策は、Repeaterを使い、recycleChildrenをtrueにし、件数を20件以内に絞ることです。これだと、パフォーマンスは何とか許せる範囲です。20件を越える部分は、Webでのページングのように次ページ、前ページなどのナビゲーションで移動するのです。recycleChildrenをtrueにするとスクロールして見えなくなったコンポーネントは、再利用され、前に入力されたデータは捨てられてしまうので、ページを処理する前に入力されたデータを手動で、配列に更新する必要があります。
配列は、1ページ用と全体用を持ち、Repeaterには、1ページ用のものをセットし、ページを移動するときに、1ページ用のデータを全体用に反映させ、次のページのデータを1ページ用の配列にセットするということです。
これで、複雑な業務アプリをFlexで作るときに踏まなければいけないパターンを一通りこなした気がします。