Dorado 9 : 引用实体下拉选择(sample-center)

如果DataType的一个PropertyDef对应的是一个数据实体,而不是普通的数据类型,那么在Grid或在AutoForm中如何显示,以及如果还要支持下拉框选择输入,该通过什么方式定义。

本例就是解答这两个问题的。

PropertyDef为实体对象在Grid或AutoForm中如何显示

一个PropertyDef为实体对象的时候,默认在Grid或AutoForm中显示的效果如:

其PropertyDef的定义为:

Customer的POJO声明如下:

如果我们希望在AutoForm或Grid中显示Customer的companyName属性,则常规方法有:

利用虚拟属性,给DataType建一个新的的PropertyDef,如命名为companyName,并设置这个propertyDef的property属性为customer.companyName(该种用法一般都是利用ORM的延迟数据加载机制自动加载数据的).

另外AutoForm中删除customer,添加与companyName对应的FormElement:

如果仅仅希望做显示效果的设置,则以上方法就足够了,但是有时候由于业务逻辑的需要,我们更希望可以直接面向这个实体对象编程,则我们可以利用DataType的defaultDisplayProperty属性实现,如本例:

这样页面上就可以直接显示companyName值了,如下图:

PropertyDef为实体对象实现下拉选择输入如何实现

以上范例如果我们还希望实体对象类型的PropertyDef还允许下拉选择输入,并且希望最终在浏览器端建立两者下拉选择的是一个实体对象,而不是虚拟属性中用assignmentMap属性实现某一个或几个属性值的赋值。

则实现步骤部分与虚拟属性下拉选择类似,最大差别在于不用配置assignmentMap.

定义DataSet

我们将采用DataSetDropDown实现实体下拉选择,那么首先我们创建一个Customer相关的DataSet:

利用DataSet提供的dataProvider技术,提供下拉框的动态数据.

@DataProvider
public Collection<Customer> findCustomersByCompanyName(String namePattern) {
	if (StringUtils.isEmpty(namePattern)) {
		return customerDao.getAll();
	} else {
		return customerDao.find(Restrictions.like("companyName",
				namePattern, MatchMode.ANYWHERE));
	}
}

DataSetDropDown的定义

添加DataSetDropDown,dataSet属性绑定到前面创建的dsCustomers。

autoOpen设置为true,使当激活这个下拉框所绑定的编辑框的时候自动打开下拉框,并设置dynaFilter属性为true,使下拉框打开的时候有查询功能:

 

下拉框的绑定

如我们希望在cutomer编辑框中提供下拉框,则可以利用dorado中的trigger技术进行下拉框的绑定:

界面效果

执行效果如下:

关于DataType的defaultDisplayProperty

在下拉框的定义中,我们知道dorado中引入了ORM技术,则下拉框中列出的数据以及我们选择操作所面对的都是数据实体而不是简单的键值。
在本例中当我们的DataSetDropDown通过"customerInterceptor#findCustomersByCompanyName"这个DataProvider最终获得的是一些数据实体,哪在本例中我们只希望展现该实体中的部门名称又该怎么办呢?
我们注意到dsCustomers对应的DataType为[BaseCustomer],在本例中我们是通过DataType的defaultDisplayProperty解决这个问题的,BaseCustomer定义在工程src/models/Demo.model.xml中:

<DataType name="BaseCustomer" parent="CommonEntity" creationType="com.bstek.dorado.sample.entity.Customer"  defaultDisplayProperty="companyName">
	<PropertyDef name="companyName" label="公司名" />
</DataType>

其中的defaultDisplayProperty定义为companyName,默认显示公司名称。

dynaFilter

本例的数据下拉框还具有过滤查询功能,这是通过DataSetDropDown的dynaFilter进行定义的,当我们设置该属性为true时,系统就会自动的将编辑框输入的值自动传输到DataSet对应dataProvider的数据请求方法中,也就是会重新调用customerInterceptor#findCustomersByCompanyName,并将编辑框中的值作为参数传入.
本例中根据智能方法适配机制,会自动调用com.bstek.dorado.sample.interceptor.CustomerInterceptor类的findCustomersByCompanyName方法:

@DataProvider
public Collection<Customer> findCustomersByCompanyName(String namePattern) {
	if (StringUtils.isEmpty(namePattern)) {
		return customerDao.getAll();
	}
	else {
		return customerDao.find(Restrictions.like("companyName",
				namePattern, MatchMode.ANYWHERE));
	}
}

其中我们输入的过滤值会通过namePattern传入,这样在该方法内部根据上下文环境我们对companyName做一个过滤查询。

dynaFilter具有多种处理机制,本例只是其中一种,dynaFilter也具有直接在客户端进行数据过滤的功能,这需要与useDataBinding属性配合使用,详细内容参考DataSetDropDown的相关说明