2011-11-03 10 views
6

は、私たちが使用できる1つのグリッド列をフィルタリングするには:複数のextjsグリッド列をフィルタリングする方法は?

{ 
    xtype: 'button', 
    text:'Search', 
    handler:function(){ 

     store.clearFilter(); 
     var searchValue = Ext.getCmp("textFieldId").getValue(); 
     store.load().filter('GridFieldName', searchValue); 

    }     
} 

が、一度に複数のフィールドを検索する方法、のようなもの:

{ 
    xtype: 'button', 
    text:'Search', 
    handler:function(){ 

     store.clearFilter(); 
     var searchValue = Ext.getCmp("textFieldId").getValue(); 
     store.filter([ 
      {property: "GridFieldName", value: searchValue}, 
      {property: "GridFieldName1", value: searchValue} 
     ]); 
    }     

} 

任意のアイデア?

これはどちらの場合でも、単一の検索が動作することです。

これは動作します:

store.filter([ 
     { property: "FirstName", value: searchValue } 
]); 

var FirstNameFilter = new Ext.util.Filter({ 
    property: "FirstName", value: searchValue 
}); 

store.filter(FirstNameFilter); 

が、これにはない:

store.filter([ 
     { property: "FirstName", value: searchValue }, 
     { property: "LastName", value: searchValue } 
]); 

またはこれを行います:

 var filters = [ 
    new Ext.util.Filter({ 
      property: "FirstName", value: searchValue 
    }), 
    new Ext.util.Filter({ 
      property: "LastName", value: searchValue 
    }) 
]; 
store.filter(filters); 

答えて

8

このようなExt.util.Filterのインスタンスを作成してください:

var filters = [ 
new Ext.util.Filter({ 
    property: "GridFieldName", value: searchValue 
}), 
new Ext.util.Filter({ 
    property: "GridFieldName1", value: searchValue 
}) 
]; 
store.filter(filters); 

また、カスタム・ロジックを単一のフィルタを作成することができます。

var filters = [ 
    new Ext.util.Filter({ 
     filterFn: function(item){ 
     return item.get('GridFieldName') == searchValue && item.get('GridFieldName1') == searchValue; 
     } 
    }) 
]; 
store.filter(filters); 
+0

私は質問、任意のアイデアを編集? –

+0

OPにはこれが動作しないと言われただけでなく、3.2(強制される)を使用しており、Ext.util.Filterは存在しません。助言がありますか? –

+0

こんにちはこのコードのフィルタ両方のフィールドが利用可能な場合にチェックし、次に結果を返す –

2

。そうじゃない?表示したようにフィルタを適用すると分かりますが、両方の基準でフィルタリングする必要があります。

store.filter([ 
    {property: "GridFieldName", value: searchValue}, 
    {property: "GridFieldName1", value: searchValue} 
]); 

代わりに、新しいフィルタを追加するためにsetFilter関数を使用できるはずです。

store.setFilter("GridFieldName", searchValue) 
store.setFilter("GridFieldName1", searchValue) 

引数なしでsetFilterを使用すると、前に定義したフィルタを再適用するだけで済みます。 clearFilterを呼び出した場合にのみ削除されます。

+0

いずれかのフィルタリングされた名前、姓または名ですか? – svenlol

+0

まあ、両方のフィルタを置く場合、1つだけで動作する、私は言うことができます、searchValueのためのjson全体のフィルタリング、複数の列に複数のフィルタが必要ですか? –

8

にフィルタリングする方法を探している間、私はこの記事を見つけましたOR論理を持つ複数の列(実際はすべての列)。

... 
var regex = RegExp('Insert searchclause here', 'i'); 
store.filter(new Ext.util.Filter({ 
    filterFn: function (object) { 
     var match = false; 
     Ext.Object.each(object.data, function (property, value) { 
      match = match || regex.test(String(value)); 
     }); 
     return match; 
     } 
})); 

HTH

4
store.clearFilter(); 
    var searchValue = Ext.getCmp("textFieldId").getValue(); 
    if (!!searchValue) { 
     var filters = [ 
      new Ext.util.Filter({ 
       filterFn: function (item) { 
        return item.get('FirstName').toLowerCase().indexOf(searchValue.toLowerCase()) > -1         
         || item.get('LastName').toLowerCase().indexOf(searchValue.toLowerCase()) > -1; 
       } 
      }) 
     ]; 
     store.filter(filters); 
    } 

これはパベルから適用されます私のコードです:私はのようなカスタムfilterFunctionのでフィルタリングなってしまった(ので、検索句は、カラムAに一致するまたは列Bなどにマッチします)。
検索のためマルチカラム、大文字と小文字を区別しない、無視位置OR論理。

このヘルプが必要です。

関連する問題