ZK属性

除了(other than)用于初始化数据成员,ZK属性还被用于控制关联元素(associated element)。

apply属性

apply="a-class-name"

apply="class1, class2,..."

apply="${EL_returns_a_class_or_a_collection_of_classes}"

apply="${EL_returns_an_instance_or_a_collection_of_Composer_instances}"

它指定了一个类,类的集合用于初始化组件。被指定的类必须实现org.zkoss.zk.util.Composer接口。然后,由于在组件及其子组件初始化之后会调用doAfterCompose方法,所以你可以在doAfterCompose方法内进行初始化。

<window apply="MyComposer"/>

此外,你可以使用EL表达式指定一个Composer实例,或Composer实例的集合。

[注]:若指定了EL表达式,其会在组件初始化之前被赋值。所以你不能够引用此组件。此外,此属性中EL表达式的self变量会引用父组件(如果有的话),或者当前页面(如果没有父组件)。。

若你想获得更多的控制,如处理异常,你也可以实现org.zkoss.zk.util.ComposerExt接口。

use属性

forEachEnd="a-class-name"

use="${EL_returns_a_class_or_a_class_name}"

指定一个类来创建一个组件(代替默认的)。在下面的例子中,MyWindow 被用于代替默认的org.zkoss.zul.Window

<window use="MyWindow"/>

if属性

if="${ an-EL-expr }"

指定为相关元素赋值(evaluate)的条件。换句话说,如果条件值为假(false),关联元素及其所有子元素会被忽略。

unless属性

unless="${ an-EL-expr }"

指定不为相关元素赋值(evaluate)的条件。换句话说,如果条件值为真(false),关联元素及其所有子元素会被忽略。

forEach属性

forEach="${an-EL-expr}"

forEach="${an-EL-expr},a-value"

有两种格式。第一种,你可以不使用逗号来指定一个值。通常为一个对象集合,这样关联元素可以依靠(against)集合中的每个对象重复被赋值。如果没有指定或为空,此属性会被忽略。如果没有集合对象被指定,仅会被赋值一次就好像有一个单元素的集合被指定。

第二种,你可以指定一个列表,使用逗号分隔各项目。然后,对于列表中的每个值,相关联的元素会被重复执行(he associated element will be evaluated repeatedly against each value in the list)。

forEachBegin属性

forEachBegin="an-interger"

forEachBegin="${an-EL-expr}"

被用于forEach 属性,指定迭代(iteration)开始处索引(从0开始)。如果没有指定,迭代会从第一个元素开始,即0。

如果forEachBegin大于或等于元素的数目,则不会发生迭代。

注:forEachBegin.index对于基本的集合,数组和其他类型是绝对的(forEachStatus.index is absolute with respect to the underlying collection, array or other type)。例如,如果

forEachBegin为5 ,forEachStatus.index的第一个值为5。

forEachEnd属性

for EachEnd="${ an-EL-expr }"

被用于forEach 属性,指定迭代(iteration)结束处索引(包括此)(从0开始)。如果没有指定,迭代会在最后一个元素处结束。

如果forEachEnd大于或等于元素的数目,则迭代会在最后一个元素处结束。

fulfill属性

fulfill="event-expr"

fulfill="event-expr1, event-expr2, event-expr3"

fulfill="event-expr=uri-expr"

fulfill="event-expr1, event-expr2=uri-expr2"

fulfill="=uri_expr"

此处的event-expr,event-expr1 和其他的类似的表达式被称为事件表达式。可以是如下的人一种格式:

event-name

target-id.event-name

id1/id2/id3.event-name

${el-expr}.event-name

uri-expr 是一个URI或EL表达式返回的URI。例如,

/my/super.zul

${my_super_zul}

指定何时创建子组件。默认(即没有指定fulfill)情况下,子组件会在父组件之后被创建,当ZUML页面被加载时。

如果你想推迟子组件的创建,你可以通过fulfill属性指定条件。条件有事件名称,还有,可选的,目标组件的标识或路径。这意味着直到目标组件指定的事件(如果指定了)发生时,子组件才会被处理。如果标识被省略,则假定为同一组件。

如果指定了EL表达式,则返回一个组件,标识或路径。

参考随机存取(Load on Demand)一节获取更多细节。

使用URI表达式

若指定了URI表达式,ZK加载器会创建定义在URI内的组件,并像子组件一样分配它们。为了创建定义在指定URI内的组件,ZK实际上调用了定义在Executions内的createComponents方法。例如,在下面的例子中,当按钮被按下时,ZK加载器会调用Ecutions.createComponents("/my/super.zul", d, null)来为d div 创建子组件。

<button id="b" label="open"/>
<div id="d" fulfill="b.onClick=/my/super.zul">
</div>

若没有指定事件表达式,ZK加载器会立刻创建组件-在分配所有的属性及创建所有的子组件之后。在下面的例子中,ZK会首先创建combobox,然后创建定义在/my/super.zul内的组件。

<div fulfill="=/my/super.zul">
    <combobox/>
</div>

onFulfill事件

在ZK执行了fulfill条件之后,即创建了了所有的后续组件之后,会触发一个org.zkoss.zk.ui.event.FulfillEvent实例的onFulfill事件来通知组件做后续处理,如果有后续事件的话。

例如,你要使用org.zkoss.zk.ui.Components类的wireVariables方法,必须再次调用wireVariables,然后在onFulfill事件内通知新组件。

<div fulfill="b1.onClick, b2.onOpen"
  onFulfill="Components.wireVariables(self, controller)">
  ...
</div>

forward 属性

forward="target_event_expr"

forward="oringal_event=target_event_expr"

这里target_event_expr 是一个事件表达式。事件表达式被用于为一个组件指定事件。可以使用下面格式中的一个:

event-name

target-id.event-name

id1/id2/id3.event-name

${el-expr}.event-name

此属性用将目标组件一个事件以其他事件名称跳转至另一个组件。这就是所谓的跳转条件(forward condition)。

例如,你可以将button的onClick事件跳转至window,如下:

<window id="w" use="MyWindow">
   ...
   <button lable="Submit" forward="onClick=w.onOK"/>
</window>

然后,你可以在MyWindow类内处理这个任务,如下:

public class MyWindow extends Window {
   public void onOK() {
      //handle the submission
   }
}

原始的事件是可选的。若忽略,则默认为onClick事件。类似的,目标ID也是可选的。若忽略了,则默认为空间所有者。因此,上面的代码也可以写成:

<window id="w" use="MyWindow">
   ...
   <button lable="Submit" forward="onOK"/>
</window>

若你想跳转多个事件,则可以在forward 属性内指定这些条件,用逗号(,)分隔:

<textbox forward="onChanging=onUpdating, onChange=some.onUpdate"/>

Forward事件

Forward事件发送的是org.zkoss.zk.ui.event.ForwardEvent类的一个实例。你可以使用getOrigin方法获取原始事件。

为Forward事件传递信息

forward="orginalEvent=targetId1/targetId2.targetEvent(eventData)"

你可以使用括号为forward事件传递特定的应用程序信息,然后添加到forward条件,如下所示。可以使用ForwardEvent类的getData方法来获取这些信息。

<button forward="onCancel(abort)"/>

上面的例子中,getData方法会返回"abort"。当然,你可以指定EL表达式来传递任何数据类型。

Forward条件内的EL表达式

forward="originalEvent=${el-targetPath}.targetEvent(${el-eventData})"。

当指定目标ID/path和特定的应用程序信息(亦称,事件数据)时可以使用EL表达式。

<button forward='${mainWnd}.onOK(${c:getProperty("status")})'/>

但是不能使用EL表达式指定事件名称。