2011-11-03 4 views
6

하나의 격자 열을 필터링하려면 다음을 사용할 수 있습니다.여러 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

글쎄, 만약 당신이 두 필터를 넣어, 하나만 작동합니다, 내가 말할 수있는 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 등 일치).
검색 대상 : 다중 열, 대소 문자 구분, 무시 위치 by OR 논리.

희망 도움말.