Dorado 9 : 联动下拉框-Flush(sample-center)

联动下拉框-Flush与联动下拉框-Reference的差别在于:联动下拉框的数据不依赖立体数据模型的数据结构,而是直接由其beforeExecute事件决定。

这样就能避免联动下拉框-Reference中提到的局限性,联动下拉框-Flush也是我们认为有更大适用范围和推荐的联动下拉框使用方式。

本例不再采用立体数据模型,因此在视图中我们可以看到Category与Product已经分开为不同的DataSet,避免ORM数据模型带来的干扰.

这样的话不同的DataSet有不同的dataProvider为其专门提供数据,其中我们注意dsProducts的dataProvider代码:

@DataProvider
public Collection<Product> getProductsByCategoryId(Long categoryId) {
	return productDao.find("from Product where category.id=" + categoryId);
}

方法根据ajax请求的categoryId参数过滤Product对象。

其他的设置与联动下拉框-Reference基本类似,特别值得注意的是ddProducts的属性设置:

由于不再依赖ORM关系,因此ddProducts的dataSet直接绑定dsProducts,并且dataPath为空。

另外还要注意ddProducts的beforeExecute事件:

var categoryId = dsForm.get("data.categoryId");
if (categoryId) {
	dsProducts.set("parameter", categoryId);
	dsProducts.flushAsync();
}

在ddProducts下拉展开数据之前,我们动态设定dsProducts的parameter参数,并调用其flushAsync方法异步加载数据。

性能优化

由于每一次ddProducts打开时都会触发beforeExecute事件,从而导致每一次都会导致dsProducts的ajax数据加载,这样用户多次操作会导致多次重复的ajax请求,如果我们能实现客户端缓存功能就可以避免数据的重复加载。

实现这个功能很简单,只要打开dsProducts的cacheable属性为true即可:

cachable在dataset的parameter参数没有变化的时候,调用其flushData或flushDataAsync的时候,都会尽量利用客户端的缓存。