在页面中嵌入代码不当会增加维护的难度,有两种途径可以从视图中分离出代码。
一种途径是你可以监听所关心的事件,然后调用合适的方法进行处理。例如,可以调用onCreate
[10], onOK
[11], onCancel
[12] 事件来完成初始化(initialize),处理(process)和取消(cancel)等工作。
<window id="main" onCreate="MyManager.init(main)" onOK="MyManager.process(main)" onCancel="MyManager.cancel(main)"/>
另外,必须有一个名称为MyManager的Java类,内容像下面一样:
import org.zkoss.zul.Window;
public class MyManager {
public static void init(Window main) { //does initialization
}
public static void save(Window main) { //saves the result
}
public static void cancel(Window main) { //cancel any changes
}
}
但是,上面的方法需要你在ZUML页面内嵌入一些代码。在用户界面(UI)内嵌入代码的优点是可以很容易的动态改变行为(特别是在原型阶段),但是这仍然会展现一些维护代码且性能会有一些降低 [13]
若不想在ZUML页面内使用Java代码,你可以继承一个组件的实现来处理事件,如下。
import org.zkoss.zul.Window;
public class MyWindow extends Window {
public void onCreate() { //does initialization
}
public void onOK() { //save the result
}
public void onCancel() { //cancel any changes
}
}
然后,使用use属性指定类,如下。
<window use="MyWindow"> ... </window>
若你喜欢使用MVC(模型-试图-控制者)方法,例如,你不想在window(视图)内嵌入处理代码,可以实现一个类来初始化window。这个类必须实现org.zkoss.zk.ui.util.Composer接口。
import org.zkoss.zk.ui.util.Composer;
import org.zkoss.zul.Window;
public class MyComposer implements Composer {
public void doAfterCompose(Component comp) {
((Window)comp).setTitle("My Title"); //do whatever initialization you want
//comp is Window since we will specify it to a window later
}
}
在这里我们假设你有三个监听器, MyCreate,MyOK,和 MyCancel。参考下面的事件章节获取事件监听器的解释。
然后,使用apply属性指定类,如下。
<window apply="MyComposer"> ... </window>
window仍然作为org.zkoss.zul.Window 的一个实例被创建,且作为comp参数被传递给doAfterCompose方法。然后,你可以处理你所希望的初始化。
若你想apply多个composer,使用逗号隔开。另外,你可以使用EL表达式来返回类,它的名称,Composer实例,或Composer实例的集合。
<window apply="MyComposer, AnotherComposer">
<textbox apply="${c:mycomposer()}"/>
</window>
在zscript中继承Java类,多亏了BeanShell[14]的强大功能,Java类的继承可以按如下的方式完成:
<zscript>
public class MyWindow extends Window {
}
</zscript>
<window use="MyWindow"/>
[提示]:很多脚本语言,例如JRuby,也允许开发人员定义可以被Java虚拟机(JVM)存取的类,请参考相应的手册来了解详情。
为了从视图中分离代码,你可以把所有的zscript代码放到单独的文件中,称为mywnd.zs,然后:
<zscript src="/zs/mywnd.zs"/> <window use="MyWindow"/>
[提示]:你也可以使用初始化指令(initdirective)来指定zscript文件的位置。不同的是初始化指令在所有组件被创建前被赋指(页面初始阶段)。如需更多信息请参考ZK用户界面标记语言一章中init指令一节。