Home   Single Page

マクロコンポーネントとIDスペース

ウィンドウのように、マクロコンポーネントはIDスペースの所有者です。つまり、マクロコンポーネント(aka.,マクロコンポーネントの子コン ポーネント)を実装するページの中で、コンポーネントを識別するどんな識別子も使えます。マクロコンポーネントと同ページ中で定義された他のコンポーネン トと衝突することはありません。

例えば、マクロを以下のように定義します。

ます。
<hbox>
    Username: <textbox id="who" value="${arg.who}"/>    
</hbox>

そうすると、以下のコードは正しく動作します。

<?component name="username" macroURI="/WEB-INF/macros/username.zul"?>
<zk>
    <username/>    
    <button id="who"/> <!-- no conflict because it is in a different ID space -->    
</zk>

しかし、以下のコードは動作しません。

<?component name="username" macroURI="/WEB-INF/macros/username.zul"?>
<username id="who"/>

どうしてでしょうか?どのIDスペース所有者もそうであるように、マクロコンポーネントそれ自体は子コンポーネントと同じIDスペースにあります。代わりの二つの解決方法があります。

1. 特別なプレフィックスをマクロコンポーネントの子コンポーネントの識別子に使用します。例えば、”who”の代わりに”mc_who”です。

    <hbox>
        Username: <textbox id="mc_who" value="${arg.who}"/>    
    </hbox>
    

    2. ウィンドウコンポーネントを使用して追加IDスペースを作成する。

      <window>
          <hbox>    
              Username: <textbox id="who" value="${arg.who}"/>        
          </hbox>    
      </window>
      

      適応できるなら、一番目の解決方法はより簡単なのでお勧めします。

      外部から子コンポーネントと通信

      他のIDスペース所有者のように、org.zkoss.zk.ui.PathまたはgetFellowメソッドを使用して、子コンポーネントに通信できます。

      例えば、マクロコンポーネントのIDを”username”と呼びます。そして、以下のようにtextboxに通信できます。

      comp.getFellow("username").getFellow("mc_who");
      new Path("/username/mc_who");
      

      親で定義された変数に通信

      マクロコンポーネントはインライン拡張のように動作します。このため、他のコンポーネントと同じように、(マクロコンポーネントの) 子コンポーネントは親IDスペースの中で定義された変数と通信できます。

      例えば、username の子コンポーネントは直接 v と通信できます。

      <zscript>
          String v = "something";    
      </zscript>
      <username/>
      

      しかしこの方法では、マクロが使える場面が制限されますので、お勧めしません。

      ランタイムで macro-uri を変更

      以下のようにマクロ URI を動的に変更できます。

      <username id="ua"/>
      <button onClick="ua.setMacroURI(&quot;another.zul&quot;)"/>