2012-08-12 2 views
6

당있는 명령은 내가이 간단한 페이지가 있습니다. 외부는 작동 중입니다.Primefaces DataTable에, 게으른 로딩 및 행

내가 valuelazy 이런 식으로 변경하는 경우 : 마법처럼

<h:form id="form"> 

    <p:dataTable value="#{testBean.unitTypeModel.load(0, 10, null, null, null)}" var="elem" lazy="false" rows="10"> 
     <p:column headerText="class">#{elem.class.simpleName}</p:column> 
     <p:column headerText="code">#{elem.code}</p:column> 
     <p:column headerText="description">#{elem.description}</p:column> 
     <p:column headerText="action"> 
      <p:commandButton action="test2" icon="ui-icon ui-icon-wrench" value="edit"> 
       <f:setPropertyActionListener target="#{testBean.selection}" value="#{elem}"/> 
      </p:commandButton> 
     </p:column> 
    </p:dataTable> 

    <p:commandButton action="test2" icon="ui-icon ui-icon-wrench"/> 

</h:form> 

CommanButtonDataTable 내부 작품.

누군가가 그 이유를 알고 있습니까?

버그입니까?

내가

  • 에 글래스 피시 해요 3.1.2
  • JSF 2.1.11 (인 Mojarra)
  • PrimeFaces 3.4-SNAPSHOT

답변

7

발견 게으른 데이터 모델이어야하는 다시 게시 요청에서 동일한 인스턴스, 매우 동일한 값을 가진 새 인스턴스가 작동하지 않습니다. 적어도 @ViewScoped 빈부터 제공되어야합니다.

+1

이 완전히 사실이 아니다를 세션을'@ViewScoped'를 사용하여 처리 할 수 ​​있지만'@ RequestScoped'를 사용할 수도 있습니다. 요점은'isRowAvailable()'메소드가'APPLY_REQUEST_VALUES'에서 평가되고'pageSize' 필드가 0보다 큰 값을 가져야 할 때 true를 리턴해야한다는 것입니다. 나는'load (...) '를 호출하고 그 결과를'setWrappedData()'에, 두 번째 메소드'setRowIndex (int rowIndex)'에 두 개의 메소드를 오버로딩하면서'LazyDataModel'을 확장하여이 작업을 수행했습니다. ''pageSize'를 기본값으로 설정합니다. – uvo

1

이 질문이 게시 된 지 4 년이 지났지 만 문제는 여전히 PrimeFaces 6.0에 남아 있습니다.

저는 ViewScoped 빈을 사용하고 싶지 않거나 사용할 수없는 사람들에게 해결 방법을 게시 할 것입니다.

전제 조건 : "ajaxified"항목을 RequestScoped 항목에 바인딩 된 지연 데이터 테이블 안에 둘 수 없습니다. " 못. 아약스 전화를 던지면 작동하지 않을 것입니다.

첫 번째 단계는 데이터 테이블 외부에서 ajax 호출을 수행하는 것입니다. 우리는 RemoteComand를 사용하여 이것을 할 것입니다. 당신은 우리가해야 할 일은 DataTable의 내부에서이 RemoteCommand를 호출하는 것입니다, 지금

<p:remoteCommand name="remoteCall" action="#{bean.doStuff()}"> 
</p:remoteCommand> 

(물론, 폼 내부에) 아무 곳이나 DataTable을 외부에서이 RemoteCommand을 배치 할 수 있습니다. 나는 자바 스크립트 호출을 수행 할 수있는 링크를 사용하고 있습니다,하지만 당신은 버튼을 사용할 수 있습니다 또는 당신이 원하는대로 :

<p:column> 
    <p:link value="#{item.id}" href="#" onclick="remoteCall([{name:'id', value:#{item.id}}])"> 
    </p:link> 
</p:column> 

이 링크가 아약스 호출을 수행 할 자바 스크립트 함수 '리모트 콜'이라고 할 수있는 방법을 제공합니다 "bean.doStuff()".

onClick 이벤트에는 "remoteCall"에 대한 javascript 호출뿐만 아니라 "# {item.id}"값을 가진 "id"라는 매개 변수가 하나만있는 매개 변수 배열이 포함되어 있습니다. 이것은 RemoteCommand가 "id"라는 이름의 param을 backing bean으로 보낼 수있게 해준다.은 "doStuff"메소드 내부

는 "ID"매개 변수 값을 검색해야합니다 : LazyDataModel``의 동일한 인스턴스가 발견되는 경우가 도움이됩니다 :

public void doStuff() { 

    String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id"); 

}