イベントリスナ中でforEachとforEachStatusを使うことは、コンポーネント作成段階[35]でのみ使用可能なので注意を払わなければなりません。こうして、以下の例は正しくありません。onClickリスナが呼び出されると、each変数が使えなくなります。
<window title="Countries" border="normal" width="100%"> <zscript><![CDATA[ String[] countries = { "China", "France", "Germany", "United Kindom", "United States"}; ]]></zscript> <hbox> <button label="${each}" forEach="${countries}" onClick="alert(each)"/> <!-- incorrect!! --> </hbox> </window>
同じ段階(コンポーネント作成段階)で行われるので、ボタンのラベルは正確に指定されています。
また、イベントリスナ中でEL表記を使うことはできません。例えば、OnclickリスナはJavaコードではないので以下のコードは実行失敗してしまいます。(つまり、EL表記はzscript中で無視されます。)
<button label="${each}" forEach="${countries}" onClick="alert(${each})"/> <!-- incorrect!! -->
each(とforEachStatus)のコンテンツをどこかに保存すれば問題は解決します。保存したコンテンツはリスナ実行中でも使用可能です。また、コンテンツはどこでも保存可能ですが、以下のようにするとわかりやすいです。
<window title="Countries" border="normal" width="100%"> <zscript><![CDATA[ String[] countries = { "China", "France", "Germany", "United Kindom", "United States"}; ]]></zscript> <hbox> <button label="${each}" forEach="${countries}" onClick="alert(self.getAttribute("country"))"> <custom-attributes country="${each}"/> </button> </hbox> </window>
ボタンラベルのように、custom属性のプロパティはコンポーネント作成段階で処理され、そこでeachを使うことができます。eachはcustom属性に保存され、コンポーネントが存在する限り(又は、プログラム上で削除されなければ)なくなりません。