2013-02-20 7 views
3

JSF-2.0 인 Mojarra 2.1.19, PrimeFaces 3.4.1 문제의JSF PrimeFaces InputText]를은 데이터 테이블

요약 내부 : DataTable에 전달 p:remoteCommand에 의해 발사 p:inputTextp:dataTable 내부와 InputText]를 행동 되세요 행 인덱스는 f:setPropertyActionListener 인 매개 변수로 사용됩니다. 그러나 그것은 항상 클릭 한 데이터를 포함하는 행의 인덱스가 아닌 dataTable의 마지막 행을 전달합니다. p:inputText. 내 이전 질문에서 볼 수 있듯이


, 나는 페이스 북에 같은 상태에 대한 소감을 즐긴다으로 p:inputText를 사용하려고하거나 등의 구현은 p:dataTable이 포함되어 있습니다. 행은 각 상태를 나타냅니다.

<p:dataTable id="dataTable" value="#{statusBean.statusList}" var="status" 
        rowIndexVar="indexStatusList"> 
    <p:column> 
     <p:panel id="statusRepeatPanel"> 
      <p:remoteCommand name="test" action="#{statusBean.insertComment}" 
       update="statusRepeatPanel"> 
       <f:setPropertyActionListener 
        target="#{statusBean.indexStatusList}" 
        value="#{indexStatusList}"> 
       </f:setPropertyActionListener> 
      </p:remoteCommand> 
      <p:inputText id="commentInput" value="#{statusBean.newComment}" 
       onkeypress="if (event.keyCode == 13) { test(); return false; }"> 
      </p:inputText> 
     </p:panel> 
    </p:column> 
</p:dataTable> 

위 코드는 언론 키를 입력 할 때, 화재 p:remoteCommand 관리 Bean의 삽입 메소드를 호출하는 말한다처럼 보인다.

@ManagedBean 
@ViewScoped 
public class StatusBean { 
    List<Status> statusList = new ArrayList<Status>(); 
    public int indexStatusList; 
    public String newComment 
    //getters and setters 
    public void insertComment() { 
     long statusID = findStatusID(statusList.get(indexStatusList)); 
     statusDao.insert(this.newComment,statusID) 
    } 

함께 디버깅 해 봅시다. 세 개의 상태가 p:dataTable에 표시되어 있다고 가정하면 p:inputText에있는 두 번째 상태 (색인 1)에있는 "relax"을 입력하고 Enter 키를 누릅니다. 디버그 콘솔에서

, 그것은 제대로 "휴식"보여 주지만, indexStatusListp:statusList의 마지막 상태 속한 2의 값을 가지고 있기 때문에 그것은 잘못된 상태를 찾습니다. dataTable 행을 클릭 한 p:inputText의 인덱스 인 1이어야합니다.

화면의 마지막 색인을 취하는 문제는 p:remoteCommand 정도라고 생각합니다.


어떻게 작동합니까?

은의이 p:commandLink 대신 p:remoteCommandp:inputText가 상상하자

<p:commandLink action=#{statusBean.insertComment> 
     <f:setPropertyActionListener target="#{statusBean.indexStatusList}" 
      value="#{indexStatusList}"></f:setPropertyActionListener> 

이 구성 요소가 성공적으로 indexStatusList이 같은 현재 하나를 클릭 전달합니다.

답변

1

이 솔루션의 개념적 문제는 어떻게 p:remoteCommand이 작동하는지에 있습니다. 이름이 name 속성에 정의 된 JavaScript 함수를 p:remoteCommand으로 만듭니다. 이것을 dataTable에 넣었을 때 test이라는 JavaScript 함수를 반복 작성하여이 테이블에 행이있을 때마다 여러 번 반복하여 마지막에 하나만 존재합니다. 따라서 솔루션은 remoteCommand이라는 이름으로 인덱스를 추가 할 수 있지만 많은 불필요한 JavaScript 함수가 있으므로 바람직하지 않습니다. 더 나은 접근법은 하나의 함수에 인수를 생성하는 것입니다.그래서 데이터 테이블의 remoteCommand 외부 정의 :

<p:remoteCommand name="test" action="#{statusBean.insertComment}" update="statusRepeatPanel"> 

을하고 onkeypress 경우에이 같은 test 함수를 호출 : 이것은 당신의 AJAX 요청에 rowNumber 매개 변수를 전달합니다

test([{ name: 'rowNumber', value: #{indexStatusList} }]) 

.

FacesContext context = FacesContext.getCurrentInstance(); 
Map map = context.getExternalContext().getRequestParameterMap(); 
Integer rowNumber = Integer.parseInt(map.get("rowNumber").toString()); 

참고 : 당신이 원하는 빈의 insertComment() 방법을 백업에서이 매개 변수를 읽을 수 그것으로 아무것도 할 각 행에 패널을 업데이트되는 한이 작동, 어쩌면 당신이 remoteCommand@parentupdate 속성을 변경할 수 있습니다 모든 행에 대해.

편집 : 당신은 자바 메소드의 코드를 다음과 같이 특정 행의 특정 패널을 업데이트 할 수 있습니다

RequestContext.getCurrentinstance().update("form:dataTable:" + rowNumber + ":statusRepeatPanel") 
+0

고마워요 내 친구. 뷰 레이어를 올바르게 업데이트하기 위해 js 함수를 완료 한 후 업데이트 값을 검토 할 것이다. –

+0

당신은 환영합니다. – partlov

+0

거기에 원격지 명령에서 update = "form : dataTable : # {rowNumber} : statusRepeatPanel"할 수있는 방법이 있습니다. 전체 양식을 업데이트하고 싶지 않으므로? –