7

プライムフェイス 3.5、モハラ 2.1.14。これは私のPFデータテーブルです。「自動」という名前の編集不可能なブール値列と、編集可能な「ラベル」列が1つ含まれています。

<p:dataTable value="#{bean.contents}" paginator="true" var="row" 
  editable="true" editMode="cell" rows="25" rowsPerPageTemplate="10,25,50" id="list">
    <p:column>
        <f:facet name="header"><h:outputText value="header1" /></f:facet>
        <p:selectBooleanCheckbox value="#{row.automatic}" disabled="true" id="isAutomatic"></p:selectBooleanCheckbox>
    </p:column>
    <p:column>
        <f:facet name="header"><h:outputText value="header2" /></f:facet>
        <p:cellEditor>
            <f:facet name="output">
                <h:outputText value="#{row.label}"></h:outputText>
            </f:facet>
            <f:facet name="input">
                <p:inputText value="#{row.label}"></p:inputText>
            </f:facet>
        </p:cellEditor>
    </p:column>
    <p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel}" update="isAutomatic"/>
</p:dataTable>

セル編集イベント リスナー:

public void onEditLabel(CellEditEvent event) {
    Object oldValue = event.getOldValue();
    Object newValue = event.getNewValue();

    if(newValue != null && !newValue.equals(oldValue)) {
        DataTable s = (DataTable) event.getSource();
        MyEntity d = (MyEntity) s.getRowData();
        try {
            d.setAutomatic(false);
            myDAO.save(d);
            addMessage("Change saved!");
        } catch (Exception ex) {
            addErrorMessage("Label could not be saved!");
            getFacesContext().validationFailed();
        }
    }
}   

セル エディターが機能し、データがリスナーに送信され、データがデータベースに正しく保持されます。「自動」フラグもセル編集イベント リスナーによってクリアされ、データベースに正しく永続化されます。問題は、クライアントで「自動」チェックボックスが更新されないことです。

私も試しました

    <p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel}" update="list"/>

これにより、チェックボックスが正しく更新されましたが、フォーカスが失われ、帯域幅が無駄になりました。

cellEdit イベントが発生した後に特定のセルだけを更新するにはどうすればよいですか?

4

2 に答える 2

5

タグp:ajaxは特定の行または列のnoの内側p:dataTableにあるため、相対的なコンポーネントIDを簡単に更新できます。RequestContextセル内の特定のコンポーネントを更新することができます。したがって、これをメソッドから削除updatep:ajaxて追加します。onEditLabel

RequestContext.getCurrentInstance().update(
  s.getClientId(FacesContext.getCurrentInstance()) +
  ":" + event.getRowIndex() +
  ":isAutomatic"
);

ご覧のとおり、セル内のコンポーネントのIDには、割り当てたIDの前に行番号があります。

于 2013-03-06T22:37:46.280 に答える
2

更新したいコンポーネントのIDの詳細を知らなくても解決できると思います。これをパラメーターとして Bean に渡すことができます。

まず、更新するコンポーネントをバインドします。このコンポーネントがバインドされている Bean は実際には必要ありません。後で JSF でこのコンポーネントを識別するために使用できる値を定義する必要があるだけです。したがって、あなたの場合、次のようなことをします:

<p:selectBooleanCheckbox binding="#{isAutomaticComponent}" value="#{row.automatic}" disabled="true" id="isAutomatic"></p:selectBooleanCheckbox>

更新時にコンポーネントにアクセスします。すなわち:

<p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel(isAutomaticComponent.clientId)}" />

これで、ID の内容を知らなくても、cellEdit イベント メソッドからコンポーネントを更新できます。すなわち:

public void onEditLabel(CellEditEvent event, String idOfComponentToUpdate) {
...
RequestContext.getCurrentInstance().update(idOfComponentToUpdate);
...
于 2014-01-27T19:01:44.787 に答える