简介
对于通过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);
}
}