Home   Single Page

イベントリスナ中のeachとforEachStatus変数の使用方法

イベントリスナ中で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!! -->        

解決策: custom-attributes

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(&quot;country&quot;))">        
            <custom-attributes country="${each}"/>            
        </button>        
    </hbox>    
</window>

ボタンラベルのように、custom属性のプロパティはコンポーネント作成段階で処理され、そこでeachを使うことができます。eachはcustom属性に保存され、コンポーネントが存在する限り(又は、プログラム上で削除されなければ)なくなりません。



[35] コンポーネントのライフサイクルの章をご覧ください。