ウィンドウのように、マクロコンポーネントは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/>
しかしこの方法では、マクロが使える場面が制限されますので、お勧めしません。