2012-03-23 1 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

У меня была аналогичная проблема. Решение немного сентиментальный, но это работает для меня, обратите внимание, что переменная фильтра определяется во второй раз в течение вызова Defer (это необходимо):

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();' он не может найти фильтр, определенный ранее. спасибо, хорошо работает ... но, я не могу понять, что делает Дефер здесь? Я использую 'filter.setValue (значение);' then 'filter.setActive (true);' then it works ... – efirat

Смежные вопросы