Dorado 9 : DataSetDropDown(DCUG)

简述

与ListDropDown所不同的是其下拉数据不是通过items属性定义的,DataSetDropDown没有提供items属性,但是却提供了dataSet和dataPath属性,通过这两个属性可以将DataSetDropDown绑定到DataSet内部的一个EntityList集合对象上。

关于DataSet和DataPath的设定和使用技巧请参考:DataControl(DCUG)#显示一个集合类对象

详细属性说明

基本属性和使用方式通过:ListDropDown(DCUG)

filterMode

数据过滤模式。

目前支持以下几种取值:

  • clientSide - 在客户端执行过滤。
  • serverSide - 在服务端执行过滤。此模式仅在useDataBinding为true是有效。
通过绑定的DataSet,可以利用其AJAX的动态刷新技术实现服务器端的查询,因此DataSetDropDown的过滤模式除了可以支持ListDropDown中默认的客户端已有数据的过滤还可以支持服务器端的数据过滤。
对于服务器端的数据过滤,默认规则是:
将编辑框中的值作为参数filterValue传递到对应的DataProvider代码中,DataProvider对应的Java代码可以通过参数filterValue获取,如:

 

@DataProvider
public Collection<Product> getProducts(Map<String, Object> parameter) {
	String productName = (String)parameter.get("filterValue");//注意参数名为filterValue
	return productDao.find("from Product where category.productName ='" + productName + "'");
}
filterValue参数名是DataSetDropDown默认的。并且其中的值是就是用户在编辑框中输入的值。

另外DataSetDropDown还提供了onSetFilterParameter事件,通过该事件自定义filterValue的值:

//@Bind #dataSetDropDown.onSetFilterParameter
!function(self, arg) {
	arg.filterValue = "自定义的值";
}

甚至直接动态的设置DataSetDropDown所绑定DataSet的其他参数值:

//@Bind #dataSetDropDown.onSetFilterParameter
!function(self, arg) {
	arg.dataSet.set("parameter",{
		categoryId:1,
		deptId:"SH001"
	});
}

filterOnTyping

与ListDropDown中filterOnTyping的默认值为true不同,考虑到大量AJAX请求给服务器带来的压力,DataSetDropDown该属性的默认值为false。

很多开发人员由于经验上的缺失导致无法清晰的知道该功能对服务器的性能压力,并且在测试环境下由于测试数据量通常都不大,就忽视了该属性的重要意义。因此DataSetDropDown默认关闭这个功能,只有系统功能有明确的需求,并且评估过没有性能瓶颈的情况下才打开这个属性。

reloadDataOnOpen

是否要在每次下拉框打开时重新装载数据。

该功能对与一些实时性要求较高的下拉框很有帮助,如查看在线用户下拉框,或界面上的联动下拉框,如下图中的产品名称下拉框:

由于用户可能会随时修改分类名称,我们希望产品名称下拉框打开的时候始终都与产品分类名称相关。那么在很多情况下就可以打开这个属性实现。

useDataBinding

是否在下拉框与DataSet之间建立数据绑定。

如果设置为true,表示下拉框中创建的将是数据控件与DataSet建立数据绑定,这样下拉框中可以实时的反应DataSet中的数据变化。 并且如果在这种情况下启用数据过滤功能,实际的数据过滤动作也将交由DataSet来完成,即利用绑定DataSet的数据重装载功能。 此时如果发生数据过滤,onFilterItem事件是不会被触发的。

如果设置为false,表示下拉框只在初始化是从DataSet中一次性的读取下拉数据,之后与DataSet不再产生关系。 并且后续的数据过滤等操作也将与dorado.widget.ListDropDown的实现方式一致。 此时如果发生数据过滤,onSetFilterParameter事件是不会被触发的。

技巧参考

google搜索栏效果的实现

确保DataSetDropDown以下几个属性的设置:

属性
useDataBindingtrue
filterModeserverSide
autoOpentrue
buttonVisiblefalse
dynaFiltertrue
filterOnTypingtrue

 

 

Attachments: