使用ExtJS从一个属性中过滤具有值数组的商店

时间:2014-03-03 10:18:06

标签: javascript extjs

我正在尝试对组合框应用约束。现在正在半工作。 在组合框中,我有这个听众:

[...]
        listeners: {
            'focus': function (combo, value) {
                var orgComboVal = Ext.getCmp('Org1')
                var getOrgValue = orgComboVal.getValue();
                if (typeof getOrgValue !== undefined) {
                    reseaulist.clearFilter(true);
                    for (var q = 0, l = getOrgValue.length; q < l; q++) {
                        reseaulist.filter([
                            {property:'code_organisme', value: getOrgValue[q]}
                        ]);
                    }
                }
            }
        }

Ext.getCmp('Org1')定义另一个组合框 当 orgComboVal.getValue()是单个值时,过滤器正在应用。
但是当它是一个值数组时,例如 [“5”,“9”] ,它不起作用并且应该被过滤的组合框没有显示任何值(所以我猜一个过滤器是仍然以不正确的方式应用。)

我想这是因为reseaulist.filter被多次调用。 我怎样才能做到这一点?

我看到了 filterBy 方法,但我不知道如何使它工作。

此外,这篇文章很有意思:How to filter a store with multiple values at once?但同样的,自

以来无法使其发挥作用
getOrgValue.split(',') 

显示错误

(Object Array has no method split)

任何提示?我正在使用ExtJS 4.2。

修改

感谢@rixo,我已经成功了。 另外,我不得不改变他提供给我的一些代码,因为Org1组合框的值总是一个数组,即使是空的,所以商店过滤器永远不会被清除。

这是:

            'focus': function (combo, value) {
                var orgComboVal = Ext.getCmp('Org1')
                var values = orgComboVal.getValue();
                console.log(values)
                if (values != null) {
                    reseaulist.clearFilter(false);
                    if (Ext.isArray(values)) {
                        if (0 < values.length) {
                            reseaulist.filterBy(function(record, id) {
                                return Ext.Array.contains(values, record.get('code_organisme'));
                            });
                        } else {
                        reseaulist.clearFilter(true);
                    }   
                    } 
                } 
            }

2 个答案:

答案 0 :(得分:0)

每个过滤器在先前过滤的数据集上一个接一个地应用,因此您的代码实现了逻辑AND。这就是为什么所有的价值都被过滤掉了......

以下是使用filterBy接受数组中任何值的示例:

function (combo, value) {
    var orgComboVal = Ext.getCmp('Org1')
    var values = orgComboVal.getValue();
    if (values != null) {
        store.clearFilter(false);
        if (Ext.isArray(values)) {
            store.filterBy(function(record, id) {
                return Ext.Array.contains(values, record.get('code_organisme'));
            });
        } else {
            record.get('code_organisme') === values;
        }
    } else {
        store.clearFilter(true);
    }
}

或者您也可以使用filter方法使用正则表达式:

function (combo, value) {
    var orgComboVal = Ext.getCmp('Org1')
    var values = orgComboVal.getValue();
    if (values != null) {
        var filterValue = Ext.isArray(values)
            ? new RegExp('^(?:' + Ext.Array.map(values, function(value){return Ext.escapeRe(value)}).join('|') + ')$')
            : values;
        store.clearFilter(false);
        store.filter('code_organisme', filterValue);
    } else {
        store.clearFilter(true);
    }
}

关于您的错误,数组确实没有split方法。字符串可以拆分为数组。就他们而言,数组可以连接成一个字符串......

答案 1 :(得分:0)

试试这个......

  

var getOrgValue =“5,9,4”; //数组值

reseaulist.filterBy(function(rec, id) {
  return getOrgValue.indexOf(rec.get('code_organisme')) !== -1;
});