2017-04-21 60 views
0

我在数据表列中有一个selectonemenu。当我删除一行时,所选的选项会被搞乱,但它似乎并不反映后端bean中的值。例如,我在第一行中选择了项目A,然后添加了另一行,并在第二行中选择了项目B,然后当我删除第一行时,第二行向上移动并选择了项目A,但后端的第二个值行仍然是项目B,而项目A已从集合中删除。Primefaces SelectOneMenu重新选择DataTable中已删除的行在新行中的选项

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

回答

0

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

相关问题