2014-01-07 2 views
1

나는 primefaces 데이터 테이블을 가지고 있으며 filter.i가있는 열에는 backing bean의 열에 필터를 적용하고 싶습니다.Backing Bean에서 데이터 테이블 jsf-primefaces

나는이 example을 따랐고, 주어진 빈칸에 필터 텍스트 상자를 입력 할 수있었습니다.

하지만 setFilter를 사용할 때 값은 HashMap에 설정되어 있지만 필터는 데이터 테이블에 적용되지 않습니다.

예 열

<p:column filterBy="#{var.value}" headerText="Example" footerText="contains" filterMatchMode="contains" /> 

빈은 세션 범위이며, 다음 코드는 버튼 클릭에 호출되는 함수입니다.

Map<String,String> theFilterValues = new HashMap<String,String>(); 
    theFilterValues.put("filterColumn","someValue"); 
    myDataTable.setFilters(theFilterValues); 

이 값을 설정하지만 데이터 테이블은 변경되지 않습니다.

나는 this을 시도했지만 도움이되지 않았습니다.

내가 원할 때마다 버튼 클릭시 데이터 테이블 열에 필터를 설정해야합니다. 미리 감사

+0

[this implementation] (http://www.bradchen.com/blog/2012/05/persist-primefaces-datatable-state-across-refresh)을 참조하십시오. 'setFilterParams'의 구현이 흥미 롭습니다. 나는 지금 당장 나 자신을 확인할 수 없다. – kolossus

답변

1

DataTable의 필터의 입력의 값을 FacesContext 요청 파라미터 맵으로 전송하고,이 DataTable에 렌더링되는 DataTableRenderer함으로써 얻어진다 (PF 3.5, PF 4.0 또는 PF 6.1 대한 encodeFilter 방법 참조)

단추가 DataTable의 동일한 양식에 있으면 필터의 값이 요청 매개 변수 맵에 보내지고 렌더러는 원하는 값 이상으로 값을 표시합니다.

<h:form> 
    <p:commandButton action="#{someBean.action()}" update="@([id$=dataTable])" /> 
</h:form> 
<h:form> 
    <p:dataTable id="dataTable" [...] > 
     <p:column filterBy="#{var.col}" filterValue="#{someBean.filterValue}"> 
      <h:outputText value="#{var.col}"> 
     </p:column> 
    </p:dataTable> 
</h:form> 

그리고, 당신은 빈의 filterValue을 변경할 수 있습니다 :

@Named 
@SessionScoped 
public SomeBean implements Serializable { 
    private String filterValue; 
    [...] 

    public void action() { 
     filterValue = "new value"; 
    } 

    [getters/setters] 
} 

당신은에 대한지도를 사용할 수 있습니다

별도의 형태로 버튼이 필요합니다 많은 필터를 사용하는 경우 filterValues. 새 페이지로 사용자를 리디렉션해야하는 경우


는 다른 방법으로 대신 filterValue를 사용하는 URL에 값을 넣을 수 있습니다. 예 :

https://example.com/app/pageOfTheTable.xhtml?form:dataTable:colum:filter=new%20value

부분 form:dataTable:colum:filter는 필터 입력의 ID이다. 당신은 당신의 브라우저를 사용하여 요소를 검사함으로써 그것을 얻을 수 있습니다. 원칙은 동일합니다. 요청 매개 변수 맵을 사용하고 있습니다.


사용자가 무언가를 입력 할 때 Backing Bean의 값을 업데이트하는 것이 유용 할 수 있습니다. patch here을 찾았습니다.

FilterFeature 클래스에서 기본적으로 populateFilterParameterMap 메서드가 변경되므로 filterValue 값이 설정됩니다. 추가 된 행을 for 루프 끝에 넣을 수 있습니다.

for (...){ 
    [...] 

+ ValueExpression filterValueVE = column.getValueExpression("filterValue"); 
+ if (filterValueVE == null) { 
+  ((UIComponent)column).getAttributes().put("filterValue", filterValue); 
+ } else { 
+  filterValueVE.setValue(context.getELContext(), filterValue); 
+ } 
} 
관련 문제