서버에서 원격 필터링 및 페이징을 표시하고 수행하는 ExtJs 테이블이 있습니다. 내 문제는 모든 요청이 전송되고 거기에 기본ExtJs가 모든 요청을 두 번 제출합니다.
localhost/request?page=1&start=0&limit=25
인
localhost/request?page=1&start=0&limit=25&filter=...
으로뿐만 아니라 전송되는 것입니다 그리고 내가 더으로 필터링하지하고 때 테이블이 첫 번째 쿼리를 표시 가진 결과 표시 할 결과. 이 동작은 결과를 필터링하여 필터링 된 결과가 1 초 동안 표시되고 첫 번째 쿼리의 "기본"결과가 표시 될 때도 나타납니다.
또한이 동작은 데이터베이스에 대한 모든 쿼리가 내 페이징이 35가 아닌 25로 설정되어 있기 때문에 아무데도 정의하지 않은 첫 번째 "기본"쿼리와 함께 추가되기 때문에 원격 정렬도 수행 할 때 나타납니다!
Ext.define('List', {
extend: 'Ext.grid.Panel',
alias: 'jobsList',
title:'Job List',
initComponent: function() {
var me = this;
Ext.define('Browser',{
extend:'Ext.data.Model',
idProperty:'var_1',
fields:me.buildFields()});
me.store=me.buildStore();
me.columns=me.buildColumns();
me.tbar=me.buildFilterBar();
me.bbar=me.buildPagingBar();
this.callParent(arguments);
},
buildStore:function(){
var me = this, store;
store = Ext.create('Ext.data.JsonStore', {
model: 'Browser',
id:store,
remoteSort:true,
remoteFilter:true,
autoLoad: {start: 0, limit: 35},
idProperty:'var_1',
proxy: {
type: 'rest',
api: {
read: 'jobs'
},
reader: {
type: 'json',
root: 'jobs',
successProperty: 'success',
totalProperty: 'total'
}
},
});
return store;
},
buildColumns:function(){
var cols=[
{text: 'Inst', dataIndex: 'var_1', flex: 1, hidden: true,sortable:true},
{text: 'Exec', dataIndex: 'var_2', flex: 1, hidden: true,sortable:true},
{text: 'Name', dataIndex: 'var_3', flex: 1,filterable : true,sortable:true},
{text: 'Param', dataIndex: 'var_4', flex: 1,sortable:true},
{text: 'Sched', dataIndex: 'var_5', flex: 1,sortable:true},
{text: 'Start', dataIndex: 'var_6', flex: 1,sortable:true},
{text: 'End', dataIndex: 'var_7', flex: 1,sortable:true},
{text: 'Stat', dataIndex: 'var_8', flex: 1,sortable:true},
{text: 'Stat2', dataIndex: 'var_9', flex: 1,sortable:true}
];
return cols;
},
buildFields:function(){
var fields=[
{name:'var_1',type:'float',convert:null,defaultValue:undefined},
{name:'var_2',type:'float',convert:null,defaultValue:undefined},
{name:'var_3',type:'string',convert:null,defaultValue:undefined},
{name:'var_4',type:'string',convert:null,defaultValue:undefined},
{name:'var_5',type:'date',convert:null,defaultValue:undefined},
{name:'var_6',type:'date',convert:null,defaultValue:undefined},
{name:'var_7',type:'date',convert:null,defaultValue:undefined},
{name:'var_8',type:'string',convert:null,defaultValue:undefined},
{name:'var_9',type:'string',convert:null,defaultValue:undefined},];
return fields;
},
buildPagingBar:function(){
var pagingbar=[
{
xtype: 'pagingtoolbar',
store: this.store,
dock: 'bottom',
displayInfo: true,
emptyMsg: 'No items to display'
}
];
return pagingbar;
},
buildFilterBar:function(){
var me = this,inst,exec,var_3,param,sched,start,end,jobvar_8,jobExit,bReset;
inst= me.buildCombo('InstanceId','var_1');
exec= me.buildCombo('ExecutionId','var_2');
name= me.buildCombo('Name','var_3');
param= me.buildCombo('Parameter','var_4');
sched= me.buildCombo('Scheduled DateTime','var_5');
start= me.buildCombo('Start DateTime','var_6');
end= me.buildCombo('End DateTime','var_7');
status= me.buildCombo('var_8','var_8');
status2= me.buildCombo('var_9','var_9');
bReset= Ext.create('Ext.Button', {text: 'Reset', handler: function() { me.resetCombos();}});
bBar=[inst,exec,var_3,param,sched,start,end,status,status2,bReset];
return bBar;
},
buildCombo:function(name,dataIndex){
var me = this,combo;
combo = Ext.create('Ext.form.ComboBox',{
queryMode:'remote',
id:dataIndex+this.id,
hideTrigger:true,
store:me.store.collect(dataIndex),
emptyText: name+'...',
displayField:dataIndex,
valueField:dataIndex,
flex:1,
listeners:{
scope:this,
change:function(t,nv,ov,eOpts){
me.filterStore();
}
}
});
return combo;
},
filterStore:function(){
var me = this, i, value, combos = ['var_1','var_2','var_3','var_4','var_5','var_6','var_7','var_8','var_9'];
me.store.clearFilter(false);
for (i = 0; i < combos.length; i++){
value = Ext.getCmp(combos[i]+me.id).getValue();
if (!Ext.isEmpty(value)){
me.store.filter(combos[i], value, true, false)
}
}
},
resetCombos:function(){
var me = this, i, value, combos = ['var_1','var_2','var_3','var_4','var_5','var_6','var_7','var_8','var_9'];
me.store.clearFilter(false);
for (i = 0; i < combos.length; i++){
Ext.getCmp(combos[i]+me.id).reset();
}
}
});
autoLoad가 설정되지 않은 경우 페이지에 들어가면 아무 것도 표시되지 않습니다. 두 번째로, 필터링에서부터 정렬에 이르기까지 모든 다른 인스턴스가 기본 요청에 의해 앞에 추가되는 것을 설명하지 않습니다. –
그러면로드를 트리거하는 항목을 찾아야합니다. 이를 위해 리스너를 [beforeload] (http://docs.sencha.com/extjs/4.2.2/#!/api/Ext.data.Store-event-beforeload) 이벤트에 설치하고'debugger' 문을 배치하십시오. . 실행이 멈출 때 스택을 내려로드를 트리거 한 원인을 찾으십시오. 예상되는 경우 계속 진행하거나 예기치 않은 상황을 분석 한 다음로드를 트리거합니다. – Saki
상점 설정에서'autoLoad'와'remoteFilter'를 끄십시오. 2 단계까지는 아무 것도로드되지 않습니다. 저장소 초기화의 다운 스트림, 뷰를 렌더링 한 후에'myStore.setRemoteFilter (true) '를 설정하십시오. 그러면 필터링이 원격으로 전환되고 단일로드가 트리거됩니다. 코드를 통해 필터를 연결하는 경우 * before *'setRemoteFilter (true) '를 수행하십시오. 저장소가 '로컬'모드 일 때 필터를 만들었더라도 필터는 적용됩니다. –