2

OmniFaces 1.3 (SNAPSHOT) Ajax ユーティリティの Ajax.updateColumn() メソッドを使用しようとしています。具体的には、次の xhtml を含む h:panelGroup (または p:outputPanel) である p:ajax update=":pageContentPanel" の使用を、Ajax.updateColumn(table, 1) の使用に置き換えたいと考えています。

<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>

Bean には、p:ajax listener="..." によって参照される次のものがあります。

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 に追加しました。

Bean は JSF @SessionScoped マネージド Bean です。p:ajax (上記の xhtml の p:calendar に属します) が実行されたときに Ajax.updateColumn() を呼び出す方法を教えてください。ありがとう。

4

1 に答える 1

1

UIData重要な点は、コンポーネントを に渡すことができるように、何らかの形でコンポーネントへのハンドルを持っている必要があるということですAjax#updateColumn()。あなたの特定のケースでは、最も簡単な方法はevent.getComponent()、の助けを借りてそれを手に入れることですComponents#getClosestParent()

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

クライアント ID を分解する必要なく、この方法で行番号を取得することもできることに注意してください。

int rowNumber = tripDatesDataTable.getRowIndex();
于 2012-10-26T17:57:17.433 に答える