联动下拉框-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的时候,都会尽量利用客户端的缓存。
Attachments:


