Primefaces SelectOneMenu重新选择新行

时间:2017-04-21 02:47:05

标签: primefaces jsf-2.2

我在数据表列中有一个selectonemenu。当我删除一行时,选中的选项会搞砸,并且它似乎不会反映后端bean中的值。例如,我在第一行中选择了项目A,然后添加了另一行并在第二行中选择了项目B,然后当我删除第一行时,第二行向上移动,选择了项目A,但后端值为第二行行仍然是项目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>

1 个答案:

答案 0 :(得分:0)

在命令按钮中删除了immediate =“true”并且它正常工作,表选择并根据后端bean正确显示值。

相关问题