我启用了cellEdit模式的Primefaces <p:datatable>
,意味着单击单元格时,它会更改为编辑模式,当您单击其他位置(onblur)时,单元格将返回输出模式并调用cellEdit ajax事件(如果已更改)。
在数据表可编辑单元格中,我使用<p:selectOneMenu>
和<p:autoComplete>
下拉列表。 Primefaces在单元格容器外生成下拉列表的HTML代码,因此每次从下拉列表中选择内容时,单元格都会保存值并退出编辑模式,我需要它保持编辑模式。
我知道这适用于<h:selectOneMenu>
,但使用其他元素对我来说不是一个选择
有没有办法让单元格编辑忽略下拉的点击?
或者有没有办法防止onblur事件在下拉打开时触发?
在我的情况下,数据表的列是动态的
我用:
Primefaces 5.3
PrimeFaces扩展4.0.0
Mojarra 2.2.9
Wildfly 8
此问题的基本示例:
XHTML:
<h:form id="form">
<p:dataTable id="cars" var="car" value="#{dtEditView.cars}" editable="true" editMode="cell" widgetVar="cellCars">
<p:ajax event="cellEdit" />
<p:column headerText="Car">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{car.title}" /></f:facet>
<f:facet name="input"><p:inputText value="#{car.title}" style="width:100%" label="Car"/></f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Color">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{car.color}" /></f:facet>
<f:facet name="input">
<p:selectOneMenu value="#{car.color}" style="width:100%">
<f:selectItem itemLabel="Red" itemValue="Red" />
<f:selectItem itemLabel="Blue" itemValue="Blue" />
<f:selectItem itemLabel="Green" itemValue="Green" />
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
</h:form>
支持bean:
@ViewScoped
@Named("dtEditView")
public class TestController implements Serializable {
List<Car> cars=new ArrayList<Car>();
@PostConstruct
public void init(){
cars.add(new Car("BMW","Red"));
cars.add(new Car("Alfa Romeo","Green"));
}
public List<Car> getCars() {
return cars;
}
public void setCars(List<Car> cars) {
this.cars = cars;
}
}
汽车对象:
public class Car {
String title;
String color;
Car(String title, String color){
this.title=title;
this.color=color;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}