2012-10-26 2 views
2

OmniFaces 1.3 (SNAPSHOT) Ajax 유틸리티의 Ajax.updateColumn() 메소드를 사용하려고합니다. 좀 더 구체적으로, Ajax.updateColumn (table, 1)을 사용하여 다음 xhtml을 포함하는 h : panelGroup (또는 p : outputPanel) 인 p : ajax update = ": pageContentPanel"을 대체하려고합니다. 빈에서p : ajax를 통해 OmniFaces Ajax.updateColumn() 또는 Ajax.updateRow()를 사용하는 방법

<h:dataTable id="dt_tripDates" style="width: 200px !important;" 
      var="tripDate" value="#{pf_ordersController.tripDates}"> 

    <p:column style="text-align: right !important;"> 
     <h:outputText id="rowNumber" value="#{tripDate.rowNumber}" /> 
    </p:column> 

    <p:column style="text-align: center !important;"> 
     <p:calendar id="tripDate" value="#{tripDate.tripDate}" 
        size="16" label="Trip Date" 
        pattern="MM/dd/yyyy" navigator="true" 
        onchange="changeOthersOnDateChange(this);"> 
      <p:ajax partialSubmit="false" event="dateSelect" 
        listener="#{pf_ordersController.tripDateSelectedOnAddUsingTemplate}" 
        update=":pageContentPanel"/> 
      <f:convertDateTime pattern="MM/dd/yyyy" /> 
     </p:calendar> 
    </p:column> 

</h:dataTable> 

, 내가 페이지에서 참조하는 다음을 가지고 : 아약스 리스너를 = "..."

public void tripDateSelectedOnAddUsingTemplate(DateSelectEvent event) { 
    DateTime dt, today = DateTime.now(), 
      tripDateTime = new DateTime(event.getDate()); 
    String clientId = event.getComponent().getClientId(); 
    Integer pos = clientId.indexOf(":tripDate") - 1, 
      rowNumber = Integer.valueOf(clientId.substring(clientId.lastIndexOf(":", pos) + 1, pos + 1)); 
    /* 
    * clientId = orderAddUsingTemplateForm:dt_tripDates:0:tripDate 
    * id = tripDate 
    */ 
    /* 
    * if tripDates in the list, that follow the argument tripDate in the list, 
    * have today's Date, then set them to the argument 
    */ 
    for (int i = rowNumber; i < nbrOfTripDates; i++) { 
     tripDates.get(i).setTripDate(tripDateTime.toDate()); 
    } 
    // OmniFaces Ajax utility to update UIData columns 
    Ajax.updateColumn(tripDatesDataTable, 1); 
} 

이 Ajax.updateColumn()를 사용하는 동안, 나는 추가 "HtmlDataTable tripDatesDataTable"을 bean에 대한 속성으로 사용하십시오.

빈은 JSF @ SessionScoped 관리 빈입니다. p : ajax (위 xhtml의 p : calendar에 속함)가 실행될 때 Ajax.updateColumn()을 호출 할 수있는 방법을 알려주십시오. 감사.

답변

1

요점은 UIData 구성 요소에 대한 핸들을 어떻게 든 가지고 있어야만 Ajax#updateColumn()에 전달할 수 있다는 것입니다. 귀하의 특별한 경우 가장 쉬운 방법은 Components#getClosestParent()의 도움으로 event.getComponent()에 문의하는 것입니다.

UIData tripDatesDataTable = Components.getClosestParent(event.getComponent(), UIData.class); 
// ... 
Ajax.updateColumn(tripDatesDataTable, 1); 

클라이언트 ID를 분류 할 필요없이이 방법으로 행 번호를 가져올 수 있습니다.

int rowNumber = tripDatesDataTable.getRowIndex(); 
+0

완벽하게 작동합니다! 또 다른 훌륭한 BalusC 응답/응답 및 솔루션! 고맙습니다. – Howard

+0

당신은 환영합니다 :) – BalusC