Extjs网格过滤器 - 动态ListFilter

时间:2012-01-31 21:03:39

标签: extjs extjs4 filtering

我正在尝试使用覆盖here in the ExtJS 4 API的数据存储(而不是硬编码列表)来实现Ext.ux.grid.filter.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
});

我在列中实现了filter配置,如下所示:

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

我有些想法:

我是否需要我的过滤器选项数据存储具有特定的列标题,例如“name”而不是“level”?

这是否尝试在从ajax加载之前获取商店选项,并且有一些未指定的方式告诉它在返回ajax后加载这些过滤器选项

我是否需要实现与列配置分开的过滤器配置才能使用此配置? (我所有的其他过滤器配置,都在列配置中完成,似乎工作正常)

修改

json响应看起来像这样,不确定是否会导致麻烦:

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

3 个答案:

答案 0 :(得分:2)

我现在已经解决了。我最后使用空选项数组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'是我用过滤器命名网格的变量)

答案 1 :(得分:0)

使用ExtJs 4.0.2a时我也一样。 I ve find what {自动加载{1}} Ext.ux.grid.menu.ListMenu`。

商店:

must false for store and some patch to

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

答案 2 :(得分:-1)

这很简单

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