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