2012-01-31 3 views
3

Я пытаюсь реализовать Ext.ux.grid.filter.ListFilter, используя хранилище данных (а не жесткий список), как описано here in the ExtJS 4 API. Данные поступают в штрафе, и я вижу вариант фильтра на этой колонке, но он просто говорит, что «Загрузка ...», где параметры фильтра должны быть:Фильтр сетки Extjs - Dynamic ListFilter

Loading...

Я уверен, что у меня есть это сконфигурировано согласно спецификациям API, но не повезло с этим. Кто-нибудь осуществил это правильно?

магазин я использую, чтобы получить параметры фильтра устанавливается вверх, как это:

// get the levels for filtering 
var levelStore = Ext.create('Ext.data.Store', { 
    fields: ['levels'], 
    proxy: { 
     type: 'ajax', 
     url: '../json?queryName=levels', 
     reader: 'json' 
    }, 
    autoLoad: true 
}); 

Я реализовал фильтр конфигурации в колонке следующим образом:

{ 
header: 'Level', 
dataIndex: 'levels', 
width: 160, 
sortable: true, 
filter: { 
    type: 'list', 
    store: levelStore 
} 

Некоторые мысли у меня были:

Нужно ли мне иметь хранилище данных параметров фильтра, чтобы иметь определенное название столбца, например «имя», а не «уровень»?

Это попытка получить параметры магазина до того, как они будут загружены из ajax, и существует какой-то неуказанный способ сообщить ему, чтобы загрузить эти параметры фильтра после возвращается ajax?

Нужно ли мне реализовать мою конфигурацию фильтра отдельно от конфигурации столбца, чтобы использовать ее? (Все остальные мои конфигурации фильтра, выполняются прямо в конфигурации колонки и, кажется, работает хорошо)

EDIT:

Ответ JSON выглядит примерно так, не уверен, если это вызывает проблемы:

[{"levels":"Level 1"},{"levels":"Level 2"},{"levels":"Level 3"}] 

ответ

2

У меня есть это решение. Я закончил настройку фильтра с пустым массивом опций options: [], а затем поместил обратный вызов в хранилище, который добавляет параметры фильтра в пустой массив параметров. Как это:

The модель колонки (с фильтром конфигурации):

{ 
    header: 'Level', 
    dataIndex: 'levels', 
    itemId: 'levels', 
    width: 160, 
    sortable: true, 
    filter: { 
     type: 'list', 
     options: [], 
     phpMode: true, 
    } 
} 

Магазин:

var levelStore = Ext.create('Ext.data.Store', { 
    fields: ['levels'], 
    proxy: { 
     type: 'ajax', 
     url: '../json?queryName=levels', 
     reader: 'json' 
    }, 
    autoLoad: { 
     callback: function() { 
      grid.getView().getHeaderCt().child('#levels').initialConfig.filter.options = levelStore.collect('levels'); 
     } 
    } 
}); 

('сетка' является переменной, что я назвал свою сетку с фильтрами)

+0

мне нужно точно то же самое, но я не я знаю, как это сделать для Ext js 3, я чувствую себя благодарным за ответ. – Thorusan86

0

У меня то же самое при использовании ExtJs 4.0.2a. I ve find what autoLoad must false for store and some patch to Ext.ux.grid.menu.ListMenu`.

Магазин:

var levelStore = Ext.create('Ext.data.Store', { 
    fields: ['levels'], 
    proxy: { 
    type: 'ajax', 
    url: '../json?queryName=levels', 
    reader: 'json' 
    }, 
    autoLoad: false 
}); 

И заменить шоу метод ext-4.0.2a/examples/ux/grid/menu/ListMenu.js с:

show : function() { 
     var lastArgs = null; 
     console.debug('show filter menu'); 
     return function(){ 
      if (this.loadOnShow && !this.loaded) { 
        this.store.load(); 
      } 
      if(arguments.length === 0){ 
       this.callParent(lastArgs); 
      } else { 
       lastArgs = arguments; 
       this.callParent(arguments); 
      } 
     }; 
    }() 
+0

Я сделал то, что вы сказали. Но теперь получаем ошибку 'Uncaught TypeError: не могу вызвать метод 'each' of null' –

-1

Это просто

filter: { 
    type: 'list', 
    options: levelStore.collect('levels') 
} 
+0

Моя проблема заключалась в том, что' levelStore' не был загружен во время рендеринга сетки. Это решение вернет пустой массив. – Geronimo

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