Store 每次 reload 会记着上次的参数,比如 params 里有 start limit 则 reload 会保持参数,那么同时用 GridFilters (ext 例子里的)和 pagetoolbar 时,如果一开始就要先 filter,如:
filters =new Ext.Grid.filters({...}); filters.getFilter('assign').setValue(CURRENTUSERID); filters.getFilter('assign').setActive(true, true); filters.getFilter('status').setValue(0); filters.getFilter('status').setActive(true, true);
则要先
config.store = new Ext.data.JsonStore({ url: config.dataSource, //读取数据的url, root: 'rows', baseParams:config.baseParams, totalProperty:'results', //总共的页数 fields: fieldsData }); config.store.lastOptions={params:{start:0,limit:config.pageSize}};
否则 ajax 请求没有 start limit 参数,因为 fiters 代码用的是 reload,当最开始没有请求分页时,则参数只有 filter 的参数。
filters 源码解析
filters 监控所有它包含的 filter 的事件 (this == filters)
Ext.util.Observable.capture(filter, this.onStateChange, this);
当一个filter 有事件时
this.deferredUpdate.delay(this.updateBuffer); //deferredUpdate == reload
reload: function() { if (this.local) { this.grid.store.clearFilter(true); this.grid.store.filterBy(this.getRecordFilter()); } else { //多个filter 短时间内连续 更新 ,只要 提取数据一次 !!!!! this.deferredUpdate.cancel(); var store = this.grid.store; if (this.toolbar) { var start = this.toolbar.paramNames.start || 'start'; if (store.lastOptions && store.lastOptions.params && store.lastOptions.params[start]) { store.lastOptions.params[start] = 0; } } store.reload(); } },