使用复选框过滤 - 逻辑问题

时间:2012-07-22 20:07:02

标签: extjs4 extjs4.1

我有一个grouped Checkbox,其中有checkboxes

当用户选择复选框时,我需要根据文本框的值过滤数据存储。当我选择2个文本框时,我得到["Albert","Francis"]的输出,当我只选择第一个文本框时,我得到["Albert"],依此类推。

现在,我需要知道如何过滤这个?

onCheckBoxGroupChange : function (field,newValue,oldValue,options) {
var chkv=newValue.chb;
console.log (chkv);
var st= Ext.getStore('People'); 
        st.on('load', function() {
           st.filter({
               filterFn: function(rec) {                   
                   return rec.get('name') == chkv; 

我遇到的问题是,当我同时选择CheckBoxes时,chkv变为["Albert","Francis"](就像数组一样),因此我无法返回{{1不寻找数组。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

怎么样:

filterFn: function(rec) {
    return Ext.Array.contains(chkv, rec.get('name'));
}

我想确保您知道如果要过滤商店,则无需重新加载商店。看起来这就是您在上面提供的代码段中所做的事情。

实际上还有其他问题,你的onCheckBoxGroupChange处理程序实际上会做什么(如果你按照上面的方式保留它),如下:

每次用户点击复选框时,它都会首先从服务器重新加载商店,然后将选定的过滤器添加到商店的过滤器中,然后按照已保存的过滤器过滤商店。

E.g:

用户点击“Albert”复选框

Store reloads 
Store adds `["Albert"]` filter function 
Store performs filtering with `["Albert"]` filter function

用户点击“弗朗西斯”复选框

Store reloads
Store adds `["Albert", "Francis"]` filter function
Store performs filtering with `["Albert"]` filter function
Store performs filtering with `["Albert", "Francis"]` filter function

用户取消隐藏“Albert”复选框

Store reloads
Store adds `["Francis"]` filter function
Store performs filtering with `["Albert"]` filter function
Store performs filtering with `["Albert", "Francis"]` filter function
Store performs filtering with `["Francis"]` filter function

您只需逐渐获得越来越多的过滤器。加上不必要地重新加载商店多次。我认为这不是你想要的。

您应该查看datastore filtering上的文档,了解有关如何解决此问题的更多数据。

此外,在您的问题中,您说当您选择两个复选框时遇到此问题,因为它返回了一个数组。根据您的问题文本,当您选择一个复选框(["Albert"])时,您也会获得一个数组。它只有一个项目,但它是一个数组。

这就是为什么我的解决方案(需要你的chkv变量是一个数组)才能工作。