[SFDC]Visualforceのループ系のタグにはカウンタ機能は無い(!!!)

結構衝撃の事実だった。
Visualforceには「apex:repeat」や「apex:dataTable」など、データセットを受け取って反復処理してくれるタグが用意されている。

コントローラの getBankList メソッドで Bank__c というカスタムオブジェクトのリストを返す。
repeatタグのvalueにリストを渡して、varで指定した変数でオブジェクトにアクセスできる。
しかし繰り返し処理してくれるだけであって、ループ内でカウンタを参照するような機能は無い。

JSTLに慣れた身としては、「c:forEach」と同じノリで’varStatus.count’みたいにしてカウンタを取れるものだと思い込んでいた。
でもそんな機能はない。仕様だからしゃーない。どうするか。
カスタムオブジェクトのリストをそのまま渡すのではなく、カスタムオブジェクトとカウンタを持ったラッパクラスのリストを返すようにする。

これでapexページでは’{!b.count}’と書いてカウンタが取れるようになった。
当然できるだろと思っていたことができないのはしんどいな。仕様だからしゃーないけど。

ちなみに、ラッパークラスを共通化したいなと思い、カスタムオブジェクトをそのまま持つのではなくて
型パラメータ化した’T’をフィールドの型にしようとしたけどだめだった。

 
そもそもこんな書き方は許されない。いやSObjectがカスタムオブジェクトと継承関係にあるのかどうか知らんけど。
フィールドの型をSObjectにするやり方だとコントローラのコンパイルは通る。

でもページからカスタム項目を参照しようとすると「アクセスが拒否されました」みたいなエラーになってしまう。
ページ側でSObjectから具体的なカスタムオブジェクトにキャストできれば良いのだけれど…


コメントを残す