内联宏

有两种类型的宏组件:内联[57]和常规。默认为常规宏。为了指定内联宏,你必须在component 指令内指定inline="true"

内联宏的行为就像内联扩展(inline-expansion)。若遇见了内联宏,则ZK不会创建宏组件。相反,它会内联扩展定义在宏URI内的组件。换言之,就好象直接将内联组件的内容的嵌入(type)到目标页面。

use.zul: (目标页面)

<?component name="username" inline="true" macro-uri="username.zul"?>
<grid>
   <rows>
      <username id="ua" name="John"/>
   </rows>
</grid>

username.zul:(宏定义)

<row>
   Username
   <textbox id="${arg.id}" value="${arg.name}"/>
</row>

等价页面:

<grid>
   <rows>
<row>
   Username
   <textbox id="ua" value="John"/>
</row>
   </rows>
</grid>

所有的属性,包括id,都会被传递到内联宏。

另外,ZK将会创建一个真实的组件(称为宏组件)来显示常规的宏。也就是说,宏组件将会作为定义在宏内组件的父组件被创建。

内联宏更易整合到复杂的页面。例如,由于rows仅接受row,所以在前一个例子中,你不能使用常规的组件,而不是宏组件(not macro components)。由于在同一ID空间内,所以更易访问定义在宏内的所有组件。这也意味着开发人员必须清楚如何实现以避免名字冲突。

常规宏允许开发人员提供额外的API,并且对组件用户隐藏实现。每个常规宏组件均是一个ID空间所有者,所以不会有名字冲突。通常假定常规宏的用户不知道如何实现。相反,他们使用定义好的API访问宏组件。

一个例子

inline.zul: (宏定义)

<row>
   <textbox value="${arg.col1}"/>
   <textbox value="${arg.col2}"/>
</row>

useinline.zul: (目标页面)

<?component name="myrow" macro-uri="inline.zul" inline="true"?>
<window title="Test of inline macros" border="normal">
   <zscript><![CDATA[
   import org.zkoss.util.Pair;
   List infos = new LinkedList();
   for (int j = 0; j < 10; ++j) {
      infos.add(new Pair("A" + j, "B" + j));
   }
   ]]></zscript>
   <grid>
      <rows>
         <myrow col1="${each.x}" col2="${each.y}" forEach="${infos}"/>
      </rows>
   </grid>
</window>



[57] 自ZK 2.3 版本后添加了内联宏组件。