Primefaces 数据表,更新行 oncelledit

Primefaces datatable, update row oncelledit

我有 primefaces 数据table,我想在编辑单元格时更新特定列或整行。已编辑单元格中的值决定了同一行中其他列中的值。

我尝试通过 onCellEdit 方法更新组件但没有成功:

String targetTypeColumn = ((DataTable)event.getSource()).getClientId(FacesContext.getCurrentInstance()) +
                  ":" + event.getRowIndex() + ":editor";

RequestContext.getCurrentInstance().update(targetTypeColumn);

列有单元格编辑器:

<p:column id="tgtType" styleClass="mapDetsTblColTypeTgt" headerText="Target Type">
    <p:cellEditor id="editor" rendered="...">
        <f:facet name="output">
            <h:outputText  value="..." />
        </f:facet>
        <f:facet name="input">
            <p:inputText value="..." styleClass="mapDetsTblInput" onselect="this.value=this.value" />
        </f:facet>
    </p:cellEditor>
    <h:outputText value="..." rendered="!..."/>
</p:column>

有什么想法吗?

我不想更新整个数据table 因为这是浪费时间。

编辑:

我尝试在单元格编辑期间更新数据table

<p:dataTable id="mapperDetailsTable" styleClass="mapperDetailsTable" widgetVar="mapperDetailsTable"
                ..... >

                <p:ajax event="cellEdit" listener="#{bean.onCellEdit}" update=":mapperDetailsForm:growlMapper mapperDetailsTable"
                oncomplete="handleCellEdit(args);" />
......

但没有效果。下一个单元格未更新。我写的对吗?我在编辑的单元格中使用自动完成功能,所以我没有更新属性。

<p:cellEditor rendered="#{guiUtils.isEditable(mapperCtrl, fieldMapping)}">
    <f:facet name="output">
        <h:outputText value="#{fieldMapping.fieldNameTgt}"/>
    </f:facet>
    <f:facet name="input">
        <p:autoComplete value="#{fieldMapping.fieldNameTgt}" completeMethod="#{mapperCtrl.dmUtils.completeTargetFields}" >
            <p:ajax event="itemSelect" listener="#{mapperCtrl.action}" process="mapperDetailsTable"/> 
            <p:ajax event="change" listener="#{mapperCtrl.action}" process="mapperDetailsTable"/> 
        </p:autoComplete>
    </f:facet>
</p:cellEditor>

编辑2:

我已检查并更新了列表中正确元素的值。

当我使用此线程的解决方案时(重新加载数据table):Updating entire <p:dataTable> on complete of <p:ajax event="cellEdit"> 一切都好。因此值已正确更新,但如何仅刷新行或单元格?

编辑 3:

我发现我可以使用命令按钮更新单元格

<p:column>
.....
                    <p:commandButton value="updateTgtRow" id="updateTgtRow"  process="@this" ajax="true" immediate="true" update="outputType inputType"/>
</p:column>

单击按钮单元格后无需重新加载即可更新 table。但是如何在单元格编辑后点击那个按钮呢?当我添加 oncomplete 时,单元格编辑不起作用。单元格是只读的。有什么想法吗?

<p:ajax event="cellEdit" listener="#{mapperCtrl.onCellEdit}" 
                    process="@this" oncomplete="#(updateTgtRow).click()"/>

我使用 p:commandButton 组件解决了我的问题

在我添加的单元格中

<p:commandButton style="display: none" value="updateTgtRow" id="updateTgtRow"  process="@this" ajax="true" immediate="true" update="outputTgtType inputTgtType"/>

它更新来自其他单元格的字段(outputTgtType 和 inputTgtType)。在 bean 中我调用点击那个按钮

String componentId = ((DataTable) event.getSource()).getClientId(FacesContext.getCurrentInstance()) + ":"
                        + event.getRowIndex() + ":updateTgtRow";

RequestContext.getCurrentInstance().execute("document.getElementById('" + componentId + "').click()");

它看起来像 hack,但它确实有效。此解决方案更新当前编辑行中的特定单元格。