Фильтр сетки Extjs - динамический фильтр ListFilter - PullRequest
3 голосов
/ 01 февраля 2012

Я пытаюсь реализовать Ext.ux.grid.filter.ListFilter, используя хранилище данных (а не жестко закодированный список), как описано в здесь, в ExtJS 4 API .Данные приходят в порядке, и я вижу параметр фильтра в этом столбце, но он просто говорит "Загрузка ...", где параметры фильтра должны быть:

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?

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

EDIT:

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

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

Ответы [ 3 ]

2 голосов
/ 02 февраля 2012

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

Модель столбца (с настройкой фильтра):

{
    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');
        }
    }
});

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

0 голосов
/ 01 июня 2013

Это просто

filter: {
    type: 'list',
    options: levelStore.collect('levels') 
}
0 голосов
/ 14 мая 2012

У меня так же при использовании ExtJs 4.0.2a. I ve find what автозагрузку 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
});

И заменить метод show в 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);
            }
        };
    }()
...