有两种类型的宏组件:内联[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>