2012-03-23 3 views
1

버튼 클릭으로 양식에 입력 된 값에서 그리드를 필터링하는 데 다음 코드가 있습니다. 문제는 필터가 처음 활성화 될 때 첫 번째 필터 (displayNameFilter) 만 요청에 포함된다는 것입니다.ExtJS 그리드 필터링 - 동시에 두 개 활성화

둘째로 두 필터가 요청에 포함됩니다. 이 문제를 해결하려면 어떻게해야합니까?

var nameFilter = grid.filters.getFilter('name'); 

if (!nameFilter) { 
    nameFilter = grid.filters 
      .addFilter({ 
       type : 'string', 
       dataIndex : 'name' 
      }); 
} 
nameFilter.setValue(Ext.getCmp('name-filter').getValue()); 

var displayNameFilter = grid.filters.getFilter('displayName'); 

if (!displayNameFilter) { 
    displayNameFilter = grid.filters 
      .addFilter({ 
       type : 'string', 
       dataIndex : 'displayName' 
      }); 
} 

displayNameFilter.setValue(Ext.getCmp('display-name-filter').getValue()); 

displayNameFilter.setActive(true, false); 
nameFilter.setActive(true, false); 
+0

정확히 같은 문제가 있습니다. 실제로이 문제의 원인이 무엇인지 알 수 있습니까? –

답변

2

이것은 나를 위해 일한 :

handler : function() { 

    var filters = []; 

    // get filters from a form... 
    var values = filterForm.getValues(); 
    for (var f in values) { 
     var value = values[f]; 
     if (value) { 
      filters.push({ property: f, value: value }); 
     } 
    } 

    //...and add all of them to the store used by the grid directly 
    if (filters.length) { 
     // prevent events firing here... 
     gridStore.clearFilter(true); 
     // ...because they will fire here 
     gridStore.filter(filters); 
    } else { 
     gridStore.clearFilter(); 
    } 
} 
2

나는 비슷한 문제가있었습니다. 이 솔루션은 약간 날조이지만, 나를 위해 작동 필터 변수가 (이 필요)를 연기 호출 내에서 두 번째로 정의되어 있는지주의 사항 :

grid.filters.createFilters(); 
var nameFilter = grid.filters.getFilter('name'); 
if (!nameFilter) { 
    nameFilter = grid.filters 
      .addFilter({ 
       type : 'string', 
       dataIndex : 'name' 
      }); 
} 
nameFilter.setActive(true); 
var displayNameFilter = grid.filters.getFilter('displayName'); 
if (!displayNameFilter) { 
    displayNameFilter = grid.filters 
      .addFilter({ 
       type : 'string', 
       dataIndex : 'displayName' 
      }); 
} 
displayNameFilter.setActive(true); 
Ext.Function.defer(function() { 
    nameFilter = grid.filters.getFilter('name'); 
    nameFilter.setValue(Ext.getCmp('name-filter').getValue()); 
    displayNameFilter = grid.filters.getFilter('displayName'); 
    displayNameFilter.setValue(Ext.getCmp('display-name-filter').getValue()); 
}, 10); 
+0

그것은 나를 위해 작동하지 않는 것 같습니다. 'nameFilter'가 먼저 호출되고, 어쨌든 첫 번째 패스에서'displayNameFilter'가 건너 뜁니다. 두 번째 패스가 작동합니다. – ipavlic

+0

'grid.filters.createFilters();를 추가하지 않으면 이전에 정의 된 필터를 찾을 수 없습니다. 덕분에, 잘 작동하지만 ... Defer가 여기서 무엇을하는지 알아낼 수 없습니까? 나는'filter.setValue (value); '를 사용하고'filter.setActive (true);'그럼 작동한다 ... – efirat