在页面中嵌入代码不当会增加维护的难度,有两种途径可以从视图中分离出代码。
一种途径是你可以监听所关心的事件,然后调用合适的方法进行处理。例如,可以调用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"/>
[提示]:你也可以使用初始化指令(init
directive)来指定zscript
文件的位置。不同的是初始化指令在所有组件被创建前被赋指(页面初始阶段)。如需更多信息请参考ZK用户界面标记语言一章中init
指令一节。