二種類のマクロコンポーネントがあります。インライン[57]とレギュラー(標準)です。デフォルトでは、レギュラーマクロスが想定されています。インラインマクロスを指定するのに、コンポーネントコマンド中でinline=”true”を指定しなければなりません。
インラインマクロはinline-expansionのように作動します。インラインマクロが指定されると、ZKはマクロコンポーネントを作成しません。その代わり、マクロURIの中で定義されたコンポーネントをインライン拡張します。つまり、インラインマクロのコンテンツを直接目標ページに入力するのと同様です。
use.zul: (target page)
<?component name="username" inline="true" macroURI="username.zul"?>
<grid>
<rows>
<username id="ua" name="John"/>
</rows>
</grid>
username.zul: (macro definition)
<row>
Username
<textbox id="${arg.id}" value="${arg.name}"/>
</row>
Equivalent page:
<grid>
<rows>
<row>
Username
<textbox id="ua" value="John"/>
</row>
</rows>
</grid>
id を含む全てのプロパティがインラインマクロに渡されます。
一方で、ZKは(マクロコンポーネントと呼ばれる)本当のコンポーネントを作成しレギュラーマクロを表します。つまり、マクロの中で定義されたコンポーネントの親としてマクロコンポーネントは作成されます。
複雑なページではレギュラーより、インラインマクロを使うほうが簡単です。例えば、前の例では、rowsはマクロコンポーネントではなくて、列のみを受け取るので、レギュラーコンポーネントを使うことはできません。インラインマクロでは、すべてのコンポーネントが同じIDスペースにあるため、アクセスするのはより簡単ですが、名前の衝突を避けなければなりません。
一方、レギュラーマクロスでは、APIを使用することができます。どのレギュラーマクロコンポーネントもIDスペースの所有者です。ですから、名前の衝突はありません。