Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Extjs 无法将筛选器重新应用于网格_Extjs_Extjs4 - Fatal编程技术网

Extjs 无法将筛选器重新应用于网格

Extjs 无法将筛选器重新应用于网格,extjs,extjs4,Extjs,Extjs4,我有一个网格(Ext.grid.Panel),需要对其应用过滤器。这些过滤器将是预定义的(与通过从网格列下拉列表中手动选择过滤器来设置的过滤器相反) 我有两个职能: // Clear filter function() { grid.filters.clearFilters(); } // Apply filter function() { grid.filters.clearFilters(); grid.filters.addFilter({ da

我有一个网格(
Ext.grid.Panel
),需要对其应用过滤器。这些过滤器将是预定义的(与通过从网格列下拉列表中手动选择过滤器来设置的过滤器相反)

我有两个职能:

// Clear filter
function() {
    grid.filters.clearFilters();
}

// Apply filter
function() {
    grid.filters.clearFilters();

    grid.filters.addFilter({
        dataIndex: 'size',
        type: 'list',
        options: ['small', 'medium', 'large', 'extra large'],
        value: ['small', 'medium']
    });

    store.load();
}
第一次应用过滤器效果很好。但是,如果调用函数清除过滤器,然后再次尝试应用过滤器,则不会过滤数据。我没有收到任何错误或反馈

我也不确定这是否是添加过滤器的推荐方法。我在网上看到过一些例子,其中过滤器直接应用于商店,但从我所看到的情况来看,网格无法识别这些过滤器是否到位


如果有任何帮助,我们将不胜感激。

您为什么要将筛选器应用于
网格。筛选器
而不是
网格。存储
?Ext.data.Store有以下方法
filter()
clearFilter()
我也必须这样做。它是将JSON“网格格式对象”(包含任意数量的网格过滤器、可见列以及排序列和方向)应用于渲染网格面板的更大函数的一部分

要求是,用户需要能够将现有gridpanel的可见列、应用的过滤器和应用的排序保存到具有名称的数据库中,然后在以后能够将这三项内容重新应用到网格面板,通过选择其保存的格式来获得相同的过滤器、可见列和排序状态

我也不想使用商店过滤器,因为所选过滤器选项需要在gridpanel过滤器功能UI(网格过滤器下拉菜单)上可见,以防用户需要调整它们

下面是一个由用户保存的网格格式JSON示例:

{
"columns":[
    "first_name",
    "last_name",
    "course",
    "course_room",
    "student_status",
    "start_date",
    "schedule",
    "time_on_course",
    "attendance",
    "this_period",
    "acct_bal"
  ],
"filters":[{
    "field":"student_status",
    "data":{
        "type":"list",
        "value":"Attending"
    }
}],
"sort":{
        "property":"start_date",
        "direction":"ASC"
    }
}
以下是函数,JSON用作参数:

applyLogFormat: function(format) {
    var log = this.getLog(),
        format = Ext.JSON.decode(format);

    log.filters.autoReload = false;

    // apply the grid filters correctly
    log.filters.clearFilters();
    Ext.each(format.filters, function(filter) {
        var gridFilter = log.filters.getFilter(filter.field);

        gridFilter.setActive(true);
        switch(gridFilter.type) {

            case 'date':
                var dateValue = Ext.Date.parse(filter.data.value, 'm/d/Y'),
                    value = filter.data.comparison == 'gt' ? {after: dateValue} : {before: dateValue};

                gridFilter = log.filters.getFilter(filter.field);
                gridFilter.setValue(value);
                break;

            case 'list':
                gridFilter = log.filters.getFilter(filter.field);
                gridFilter.menu.setSelected(gridFilter.menu.selected, false);
                gridFilter.menu.setSelected(filter.data.value.split(','), true);
                break;

            default :
                gridFilter = log.filters.getFilter(filter.field);
                gridFilter.setValue(filter.data.value);
                break;
        }
    });

    // remove any pre-existing sorting from the grid
    Ext.each(log.columns, function(column, index) {
        if (column.hasCls('x-column-header-sort-ASC') ||
            column.hasCls('x-column-header-sort-DESC')) {
            log.columns[index].setSortState(null);
            return false;
        }
    });

    // show only the specified columns
    log.suspendLayout = true;
    Ext.each(log.columns, function(column) {
        if (column.dataIndex) {
            column.setVisible(Ext.Array.contains(format.columns, column.dataIndex));
        }
    });
    log.suspendLayout = false;
    log.doComponentLayout();

    // set the sorter
    if (format.sort) {
        var column = log.down('gridcolumn[dataIndex=' + 
            format.sort.property + ']');
        column.setSortState(format.sort.direction);
        log.filters.autoReload = true;
    } else {
        log.store.sorters.clear();
        log.store.loadPage(1);
        log.filters.autoReload = true;
    }
}
这些都是为4.1.0完成的

编辑:

我意识到实现中有一个重要的部分是无法从该函数中看到的

通常,gridpanel
过滤器功能
菜单只有在用户实际单击其中一个菜单后才能创建。然后它们都被创造出来了。我想这是为了节省内存

显然,在创建过滤器菜单之前,此功能将不起作用

为了处理这个问题,我在gridpanel的
afterrender
事件中显式地创建它们,以便它们立即可用。即使用户没有单击其中一个过滤器菜单,此功能也将工作

我使用的是MVC模式,所以我使用了gridpanel的控制器,如下所示:

// code from gridpanel's controller
var me = this;
me.control({

    'log': {
        afterrender: function() {
            me.getLog().filters.createFilters();
        },
    },

    // ... other event handlers

});

在网格初始化代码中尝试此操作

filtersCfg.createFilters();

filtersCfg.filters.each(function (filter) {
     filter.setActive(true);
     filter.setActive(false);
});

关于我申请
grid的原因,请参阅我的原始问题。过滤器
grid会识别它。别担心。我们在所有的应用程序中都使用这种方法。使用
store.filter
为我过滤数据,但是网格列的过滤器菜单不知道过滤器,调用
grid.filters.clearFilters()
没有效果。FWIW,我跟着。当我将过滤器直接应用到商店时,我是否需要在商店和电网之间进行任何额外的布线?您可以使用该方法重新应用过滤器吗?调用
grid.filters.clearFilters()
后,我尝试的一切都无法应用新的过滤器。没有错误或任何东西,并且日志记录
grid.filters.getFilterData()
显示一个空数组。@我现在正在使用的应用程序上运行它。我仔细检查以确保没有任何其他UX应用于此网格。这是一个正常的网格,除了
过滤器功能
,但我很确定您已经有了它。你在争论中传递了什么?另外,如果您使用的是4.1.0或4.1.1,我不知道网格上的某些功能是否已更改,这可能会破坏此功能。@我意识到您可能遇到问题的原因,请参阅上面的编辑。@Geronimo我在网格默认筛选方面遇到问题。我将默认过滤器定义为grid.filters,正如您上面所说,除非用户单击标题菜单,否则我无法确定过滤器将如何激活。我找了好几天了。我在这里也提出了一个问题,也许你知道我的解决方案。我的问题: