我目前有一个带有条件删除按钮的primefaces datatable表,如果单击该按钮将删除行。第一次点击它是有效的。它将删除该行,并用新表刷新表。当我再次尝试从表中删除某些内容时,表将在没有条目的情况下自行刷新。如果我使用我创建的一个按钮更新表,表将再次显示,我试图删除的条目仍然在那里。查看它,我看到当我成功删除第一个时,正在调用正在操作的方法。但是,当我再次尝试时,没有调用该方法。为什么不呢?
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
<h:form>
<p:dataTable id="carTable" var="car" value="#{dtBasicView.cars}">
<f:facet name="header">
Car Table
</f:facet>
<p:column headerText="Id" sortBy="#{car.id}">
<h:outputText value="#{car.id}" />
</p:column>
<p:column headerText="Year" sortBy="#{car.year}">
<h:outputText value="#{car.year}" />
</p:column>
<p:column headerText="Brand" sortBy="#{car.brand}">
<h:outputText value="#{car.brand}" />
</p:column>
<p:column headerText="Color" sortBy="#{car.color}">
<h:outputText value="#{car.color}" />
</p:column>
<p:column headerText="Delete Option">
<p:commandLink action="#{dtBasicView.deleteCar(car)}"
update="@form" rendered="#{car.isWhite}" value="Delete" ajax="true">
</p:commandLink>
</p:column>
</h:form>
</h:body>
</html>
和豆子
@ManagedBean(name="dtBasicView")
@ViewScoped
public class BasicView implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Car selectedCar;
private List<Car> cars;
private List<Car> oneHundredCars;
private int numberOfcars=0;
@ManagedProperty("#{carService}")
private CarService service;
@PostConstruct
public void init() {
oneHundredCars = service.createCars(100);
}
public void setNumberOfcars(String num) {
this.numberOfcars = Integer.parseInt(num);
cars = oneHundredCars.subList(0, numberOfcars);
}
public List<Car> getCars() {
return cars;
}
public void setService(CarService service) {
this.service = service;
}
public Car getSelectedCar() {
return selectedCar;
}
public void setSelectedCar(Car selectedCar) {
this.selectedCar = selectedCar;
}
public boolean getIsEmpty() {
return cars == null || cars.isEmpty();
}
public void deleteCar(Car car) {
cars.remove(car);
int size = cars.size();
setNumberOfcars(""+size);
}
}
小更新:我仍然没有解决我的问题。我已经移动了一些东西,所以列表不会重新调整大小。现在,每当我点击第二个删除命令链接时,整个数据表都会被新的随机数据刷新。
另一个更新:它看起来好像在点击第二次删除后再次调用@PostConstruct。通过这样做,它正在重建一套全新的汽车阵列。
昨天花了一整天的时间试图弄清楚为什么会发生这种情况,我终于解决了它。我已经将命令链接更改为命令按钮,这些更改都不起作用。对我来说有效的是让按钮不是ajax提交,而是非ajax提交。我仍然不知道为什么这工作,所以如果有人可以解释这将是很大的帮助。