primefaces datatable row delete不会删除UI中的同一行

时间:2014-04-25 17:49:15

标签: jsf-2 primefaces

我正在使用primefaces 4.0。我有一个动态数据表,每行有selectonemenu组件,每行有删除按钮。单击删除按钮,精确行将在managedbean的列表中删除,但在UI中,我只看到最后一行被删除。这非常具有误导性。

通过谷歌搜索,我看到下面链接中已经解决的相同问题,在删除按钮中设置“立即=真”设置会导致此问题。 Primefaces 3.4 Datatable doesn't refresh correctly after delete row

想知道立即属性如何导致此问题。

但我的实际问题是我无法删除immediate = true属性,如果我这样做,删除按钮单击将导致验证阶段触发,然后我将获得验证消息。我希望用户能够在验证失败的情况下删除行,因此我在删除按钮中设置了immediate = true,以便不验证行。

有人可以帮忙吗?

                            <p:dataTable id="levDataTbl" value="#{leventrybean.leaves}" var="lev"
                             widgetVar="levDataTbl">  
                             <p:column >
                                <p:selectOneMenu value="#{lev.employee}"  var="e"
                                    filter="true" filterMatchMode="contains" id="empDrpDown"
                                    rendered="#{leventrybean.sizeOfDirectorates > 0 }" required="true"
                                    styleClass="px75DrpDown" converter="empconverter" 
                                     >
                                    <f:selectItem itemLabel="-Select-" itemValue="" />
                                    <f:selectItems value="#{leventrybean.employees}" var="employee"
                                    itemLabel="#{employee.empName}" itemValue="#{employee}"/>   
                                    <p:ajax process="@this" update="@form" listener="#{lev.changeEmpListener}" /> 
                                    <p:column >
                                    #{e.empName}
                                    </p:column>
                                    <p:column >
                                    #{e.empCd}
                                    </p:column>         
                                </p:selectOneMenu>                                            
                                <p:outputLabel value="#{sessionScope['fullname']}" 
                                    rendered="#{leventrybean.sizeOfDirectorates == 0 }"
                                    />
                             </p:column>
                             <p:column >
                                <p:selectOneMenu value="#{lev.selectedLeaveType}" 
                                    filter="true" filterMatchMode="contains" var="levtp" id="levDrpDown"
                                    rendered="true" converter="levtypconverter" styleClass="px75DrpDown"
                                    required="true">  
                                     <f:selectItem itemLabel="-Select-" itemValue="" />
                                    <f:selectItems value="#{lev.leavesAllowed}" var="l"
                                        itemLabel="#{l.leaveTypeDesc}" itemValue="#{l}"/>
                                    <p:ajax process="@this" update="@form" listener="#{lev.changeLevTypListener}"/>    
                                    <p:column>#{levtp.leaveTypeDesc}</p:column>
                                </p:selectOneMenu>
                             </p:column>
                             <p:column  style="width:6%">
                                <p:commandButton id="deleteLeave" update="@form" image="ui-icon ui-icon-trash"  >
                                    <f:setPropertyActionListener value="#{lev}" target="#{leventrybean.selectedLeaveForDel}" />
                                </p:commandButton>
                             </p:column>                                           
                            </p:dataTable>

删除按钮的Bean代码位于...

之下
public void setSelectedLeaveForDel(Leave obj){
    deleteLeave(obj);
}
private void deleteLeave(Object obj){
    try{

        this.leaves.remove(obj);

    }catch(Exception e){
        log.error("Error in deleteLeave() ::"+e);
        log.error(Utility.getStackTrace(e));            
    }    
}    

0 个答案:

没有答案