简介
对于通过View文件定义的视图,我们可以通过一段Java逻辑代码来动态改变或创建视图中的内容,如动态调整控件属性,动态创建控件,通过这种方式可以更好的与后台Java逻辑进行整合,进行更灵活的控制。
范例URL: http://dorado.bstek.com/sample-center/com.bstek.dorado.sample.basic.DynaView.d
interceptor
视图模型通过该属性定义动态视图技术对应的Java类,如下范例:
<View listener="spring:dynaView#onViewInit" layout="padding:20" title="Dyna View">
interceptor的值为一个服务表达式,在本例中采用的是spring的一个注册bean,名称为dynaView。
annotation申明
在本例中采用Spring的annotation注册dynaView:
package com.bstek.dorado.sample.basic; import org.springframework.stereotype.Component; import com.bstek.dorado.common.event.DefaultClientEvent; import com.bstek.dorado.view.widget.base.Button; import com.bstek.dorado.view.widget.base.Panel; import com.bstek.dorado.view.widget.layout.AnchorLayoutConstraint; import com.bstek.dorado.view.widget.layout.AnchorMode; @Component public class DynaView { //省略....... }
采用annotation机制时,注意添加@Component字符串。
panelButtons定义
在本例的视图配置文件中我们定义了一个Panel对象:
<Panel id="panelButtons" layout="Anchor"> <Property name="height">200</Property> <Property name="width">600</Property> </Panel>
假设我们的愿望是希望定义一个空白的Panel,由spring:dynaView动态生成内部控件。
onViewInit方法
方法名称
在DynaView.java类中我们定义了onViewInit方法,当动态视图起作用时,视图模型会根据listener的配置服务表达式执行其onViewInit方法。
方法参数
方法参数可灵活定义,可以没有参数也可以根据需要直接注入内部代码所需的控件对象,只要注意变量名与控件的id一致即可。如可以这么定义:
public void onViewInit(Panel panelButtons, Dialog dialogMsg, Button buttonSave, Menu menuMain) {
方法代码说明
//注入panelButtons对象,便于在其中动态加入空间对象 public void onViewInit(Panel panelButtons) { //动态设置panelButtons的标题 panelButtons.setCaption("此标题是通过视图拦截器设置的"); //动态生成8个Button控件 for (int i = 1; i <= 8; i++) { Button button = new Button(); //设置按钮的标题 button.setCaption("Button " + i); //设置按钮的布局 AnchorLayoutConstraint layoutConstraint = new AnchorLayoutConstraint(); layoutConstraint.setAnchorLeft(AnchorMode.previous); layoutConstraint.setLeft("5"); layoutConstraint.setTop("10"); button.setLayoutConstraint(layoutConstraint); //给按钮添加单击事件 button .addClientEventListener( "onClick", new DefaultClientEvent( "dorado.MessageBox.alert('You clicked ' + self.get('caption'));")); //将按钮加入panelButtons对象中 panelButtons.addChild(button); } }