除了(other than)用于初始化数据成员,ZK属性还被用于控制关联元素(associated element)。
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
接口。
forEachEnd="a-class-name"
use="${EL_returns_a_class_or_a_class_name}"
指定一个类来创建一个组件(代替默认的)。在下面的例子中,MyWindow
被用于代替默认的org.zkoss.zul.Window
。
<window use="MyWindow"/>
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="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。
for
EachEnd="${
an-EL-expr
}"
被用于forEach
属性,指定迭代(iteration)结束处索引(包括此)(从0开始)。如果没有指定,迭代会在最后一个元素处结束。
如果forEachEnd
大于或等于元素的数目,则迭代会在最后一个元素处结束。
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表达式,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>
在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="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="orginalEvent=targetId1/targetId2.targetEvent(eventData)"
你可以使用括号为forward
事件传递特定的应用程序信息,然后添加到forward
条件,如下所示。可以使用ForwardEvent
类的getData
方法来获取这些信息。
<button forward="onCancel(abort)"/>
上面的例子中,getData
方法会返回"abort"
。当然,你可以指定EL表达式来传递任何数据类型。