我正在尝试对组合框应用约束。现在正在半工作。 在组合框中,我有这个听众:
[...]
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);
}
}
}
}
答案 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; });