Dorado 9 : 动态视图(sample-center)

简介

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

Attachments:

DynaView.png (image/png)
image2020-5-9 16:38:6.png (image/png)