2008/12/13

labelFunctionかItemRendererか。それとあとFormatter (1)

FlexのDataGridはいろいろと便利機能が組み込まれてるのだけれど、その中でも表示対象のデータの中身に応じて表示文字列を変えられるラベル関数(labelFunction)はなんだかんだいって多用する。
と、その一方でリッチな文字列だろうがアイコン画像だろうが表示をカスタマイズしてくれるItemRendererなんていうのもあって、どっちを使えばいいのか悩むってことが結構あったりして。

何にせよ揺れたりするのは良くないので、ここいらでポリシーを固めておきたいところ。

両者の特徴としては、
・labelFunction: 簡便。文字列の変換にしか使えない。典型的には金額形式での表示とか。
・ItemRenderer: 仕組みとしては複雑。一方で何にでも使える。 典型的にはデータ状態に応じて赤くするとか。
というあたり。

ただ、重要なことは、labelFunctionでフォーマットした結果ががItemRendererに渡ってくるということ。
# 正確に言えば違くて、DataGridのデフォルト実装であるところのDataGridItemRendererにしろ、典型的なアイテムレンダラであるLabelにしろ、dataのsetter内で自身の表示文字列をlistData.labelに設定しているため、その動きに見える、というだけ。
# 少なくとも、labelFunctionとItemRendererの指定は両立しうる、ということは言えると思う。

ちうことは、役割をちゃんと分担させるという意味で、ItemRendererでは特にフォーマットしないでおいて、表現上の問題(色を変えたり、とか)に徹するのが吉?なのかなと。

まぁ、それは基本なので普通にやってるうちはいいのですが、いろいろと応用を考えた場合、それでいいのかどうかはちょっと疑問。
しばらくそこら辺を深掘りしてみようかと。

たとえば、上記の金額の表示とか。
でかい金額を扱うような話だと、ときに1000単位とか100万単位とかに表示を切り替えてみたりとか、
そういうのが必要になったりする。
さすがにDataGridの表示対象のデータ(データプロバイダ)を直接いじるのは嫌なので、やっぱりそこはlabelFunctionかItemRendererかということなんだろうけど、そもそもそれって出来るのかな、みたいな。
それも可能なら上記のポリシーに合わせてlabelFunctionにしてみたいなぁって。

あと、そういえばFlexの標準でFormatterっていうのが提供されているけど、てんでDataGridのlabelFunctionのことなんか考えてくれてないから、そこんとこ上手くやりたいよねぇ、とか。