Extjs提供的store虽然具有过滤功能,但是不具备分页进行搜索的功能。
这里提供一个 具有能够分页的搜索方案。
1. js文件中:
a. 在grid 的 constructor 中:
this.store.load({params:{pageStyle:'paging',start:this.nRecordStart,limit:this.nShowRecords,goodTypeNum:'',batchNum:'',orderState:''}});
b. 在搜索按钮的事件处理函数中:
/**处理搜索按钮的点击事件
* @author William
* */
,onSearchClick:function(){
//获取搜索面板中的搜索条件值
var batchNum = this.find('name','SearchFieldset_batchNum')[0].getValue();
var goodTypeNum = this.find('name','SearchFieldset_goodTypeNum')[0].getValue();
var orderState = this.find('name','SearchFieldset_orderState')[0].getValue();
// 这里很关键,如果不加,翻页后搜索条件就变没了,这里的意思是每次数据载入前先把搜索表单值加上去,这样就做到了翻页保留搜索条件了
this.store.on('beforeload',function(){
Ext.apply(
this.baseParams,
{
batchNum: batchNum
,goodTypeNum:goodTypeNum
,orderState:orderState
});
});
// 根据搜索条件重新加载数据
this.store.load({params:{pageStyle:'paging',start:this.nRecordStart,limit:this.nShowRecords, batchNum:batchNum, goodTypeNum:goodTypeNum, orderState:orderState }});
}
2. Action中:
public String sAllOrdersInfo() throws SQLException{
System.out.println(" OrderAction_sAllOrdersInfo executes !");
String json = "";
int end = start + limit;
List<OrderAllInfo> listOrders = new ArrayList<OrderAllInfo>();
List<OrderAllInfo> listOrdersSends = new ArrayList<OrderAllInfo>();
// 获取前端传入的搜索字段
String goodTypeNum = super.getRequest().getParameter("goodIdNum"); // 货号
String batchNum = super.getRequest().getParameter("batchNum"); // 批号
String orderState = super.getRequest().getParameter("orderState"); // 生产单状态
// 调整输入的字段
if( null != orderState ){
if( orderState.equals("所有")){
orderState = "";
}
}
// 执行查询
try {
listOrders = orderService.sAllOrdersInfo( goodTypeNum, batchNum, orderState );
} catch (SQLException e) {
e.printStackTrace();
}
// 数据调整
//如果采用的是分页模式
if( pageStyle.equals("paging") ){
end = start+limit;
int length = listOrders.size();
if(end > length){
end = length;
}
listOrdersSends = listOrders.subList(start, end);
super.setContentType(super.JSON);
json = "{count:" + listOrders.size() + ",items:" + super.getJSONArrayString(listOrdersSends) + "}"; // 将数据全部发到前端
}
// 如果采用的不是分页模式
else{
super.setContentType(super.JSON);
json = "{count:" + listOrders.size() + ",items:" + super.getJSONArrayString(listOrders) + "}"; // 将数据全部发到前端
}
super.outPrint(json);
return "json";
}
3. xml中:
条件是:
WHERE ( g.good_type_num LIKE '%$goodTypeNum$%' ) AND ( o.batch_num LIKE '%$batchNum$%' ) AND ( o.order_state LIKE '%$orderState$%' )
注:
以上条件为:只要某字段中出现了相应条件对应的字符或者数字即可。 而如果字段中可能出现 2, 12 , 这种情况怎么办呢?
解决方案:
action中:
String sCity = "";
if( 20 == city ){
sCity = "%%";
}else{
sCity = city + "";
}
// 构建参数map
HashMap map = new HashMap<String, Object>();
map.put("city", sCity);
map.put("name", name);
XML中:
WHERE eb.enterprise_name LIKE '%$name$%' AND eb.enterprise_city LIKE '$city$'