Inline Macros

From Documentation

An inline macro is a special macro component that behaves like inline-expansion. Unlike a regular macro component, ZK doesn't create a macro component. Rather, it inline-expands the components defined in the macro URI, as if the content of the in-line macro's template is entered directly in the target page.

Declare Inline Macro

To declare an inline macro, we have to specify inline="true" in the component directive, while the definition and the use of an inline macro is the same as the regular macro components (i.e., non-inline).

For example, suppose we have a macro definition (aka., template) as follows:

<!-- username.zul: (macro definition) -->
<row>
	Username
	<textbox id="${arg.id}" value="${arg.name}"/>
</row>


We can declare it as an line macro as follows:

<!-- target page -->
<?component name="username" inline="true" macroURI="username.zul"?>
<grid>
	<rows>
		<username id="ua" name="John"/>
	</rows>
</grid>


Then, it is equivalent to:

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

Notice that all properties, including id, are passed to the inline macro too.

Inline versus Regular Macro

As described above, an inline macro is expanded inline when it is used as if they are entered directly. On the other hand, ZK will create a component (an instance of HtmlMacroComponent or deriving) to represent the regular macro. That is, the macro component is created as the parent of the components that are defined in the template.

Inline macros are easier to integrate into sophisticated pages. For example, you cannot use regular components in the previous example since rows accepts only row as children, not macro components. It is also easier to access to all components defined in a macro since they are expanded inline. However, it also means the developers must take care of id by themselves.

On the other hand, regular macros allow the component developers to provide a custom Java class to represent the component, such that a better abstraction and addition functionality can be implemented. We will discuss it more in the following section.

An Example

inline.zul: (the macro definition)

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

useinline.zul: (the target page)

<?component    name="myrow"    macroURI="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>

Version History

Last Update : 2010/11/8

Version Date Content
     



Last Update : 2010/11/08

Copyright © Potix Corporation. This article is licensed under GNU Free Documentation License.