Primefaces SelectOneMenu 在新行的 DataTable 中的已删除行中重新选择选项

Primefaces SelectOneMenu reselect option in deleted row within DataTable in new row

我在数据表列中有一个 selectonemenu。当我删除一行时,selected 选项被弄乱了,它似乎没有反映后端 bean 中的值。例如,我在第一行 selected Item A,然后在第二行添加另一行和 select Item B,然后当我删除第一行时,第二行与 Item 一起向上移动A selected,但第二行的后端值仍然是项目 B,项目 A 已从集合中删除。

            <p:dataTable id="insertDetailTable" styleClass="data-table"
                rowIndexVar="rowIndex" var="receivingDetail"
                value="#{receivingController.receiving.receivingDetails}">

                <p:column headerText="Item">
                    <p:selectOneMenu styleClass="input" id="item"
                        value="#{receivingDetail.item}" required="true"
                        requiredMessage="Item is required" converter="itemConverter">
                        <f:selectItem itemLabel="Select an item" itemValue="#{null}"
                            noSelectionOption="true" />
                        <f:selectItems value="#{receivingController.items}" var="item"
                            itemLabel="#{item.code} - #{item.name}" itemValue="#{item}" />
                        <p:ajax update="insertDetailTable" />
                    </p:selectOneMenu>
                </p:column>

                <p:column styleClass="action-cell">
                    <f:facet name="header">
                        <p:commandButton icon="ui-icon-plus" value="Add"
                            action="#{receivingController.insertDetail('insert')}"
                            immediate="true" />
                    </f:facet>
                    <p:commandButton icon="ui-icon-trash"
                        action="#{receivingController.deleteDetail('insert', receivingDetail)}"
                        immediate="true">
                        <p:confirm header="Confirmation"
                            message="Do you wish to remove the selected detail?"
                            icon="ui-icon-alert" />
                    </p:commandButton>
                </p:column>
            </p:dataTable>

新增一行和删除一行的后端代码:

public void insertDetail(String owner) {
    ReceivingDetail receivingDetail = new ReceivingDetail();
    receivingDetail.setReceiving(receiving);
    receivingDetail.setQtyStored(new BigDecimal("0.00"));
    receiving.getReceivingDetails().add(receivingDetail);

    RequestContext context = RequestContext.getCurrentInstance();
    if (owner.equals(OWNER_INSERT)) {
        context.update("insertForm");
        context.execute("PF('insertDialogWV').show();");
    } else if (owner.equals(OWNER_UPDATE)) {
        context.update("updateForm");
        context.execute("PF('updateDialogWV').show();");
    }
}

public void deleteDetail(String owner, ReceivingDetail receivingDetail) {
    receiving.getReceivingDetails().remove(receivingDetail);
    ItemService itemSvc = (ItemService) getService(ItemService.class);
    setItems(itemSvc.find());

    RequestContext context = RequestContext.getCurrentInstance();
    if (owner.equals(OWNER_INSERT)) {
        context.update("insertForm");
        context.execute("PF('insertDialogWV').show();");
    } else if (owner.equals(OWNER_UPDATE)) {
        context.update("updateForm");
        context.execute("PF('updateDialogWV').show();");
    }
}

知道我的代码出了什么问题吗?

我正在使用 Primefaces 5 和 JSF 2.2。

这是我第一次发帖提问,不确定我做的对不对,如果需要更正请告诉我,在此先感谢。

已编辑: 以防万一需要此信息,数据表就这样驻留在对话框中。

<h:form id="insertForm">
    <p:dialog id="insertDialog" widgetVar="insertDialogWV" modal="true"
        draggable="false" resizable="false" header="Add Record"
        closable="false">

    </p:dialog>
</h:form>

删除命令按钮中的 immediate="true" 并且可以正常工作,table select 并根据后端 bean 正确显示值。