我正在使用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));
}
}