我创建了一个带有可编辑单元格的数据表(组件<p:cellEditor>
),
以example为主要参考。
<h:form id="form">
<p:dataTable id="table" value="#{cars}" var="entity" editable="true" editMode="cell" tableStyle="width:auto">
<p:ajax event="cellEdit" listener="#{carBean.onCellEdit}" />
<p:column headerText="Owner">
<p:cellEditor id="ownerCell">
<f:facet name="input">
<p:selectOneMenu value="#{entity.owner.id}" style="width:100%">
<f:selectItems value="#{ownerBean.owners}" var="owner" itemLabel="#{owner.name}" itemValue="#{owner.id}" />
</p:selectOneMenu>
</f:facet>
<f:facet name="output">
<h:panelGroup id="ownerOutput"><h:outputText value="#{entity.owner.name}" /></h:panelGroup>
</f:facet>
</p:cellEditor>
</p:column>
我的问题是更新细胞。我可以更改selectOneMenu元素的值,但不更新构面组件输出(id =&#34; ownerOutput&#34;)。我已经检查过,只有当构面输入和输出具有相同的属性值时,即
<p:selectOneMenu value="#{entity.owner.name}" style="width:100%">
<f:selectItems value="#{ownerBean.owners}" var="owner" itemLabel="#{owner.name}" itemValue="#{owner.name}" />
然后代码工作。但我想用id的原始代码。 我试过的其他解决方案没有成功:
解决方案1:
<p:ajax event="cellEdit" listener="#{carBean.onCellEdit}" update="table" />
解决方案2:
public void onCellEdit(CellEditEvent event) {
Object newValue = event.getNewValue();
if(newValue != null) {
int alteredRow = event.getRowIndex();
String columnName = event.getColumn().getHeaderText();
FacesContext context = FacesContext.getCurrentInstance();
Account entity = context.getApplication().evaluateExpressionGet(context, "#{entity}", Car.class);
entity = service.findAndLoadEntityWithLazyReferencesById(Car.class, entity.getId());
if(columnName.equals("Owner") {
entity.setUsername((String) newValue);
}
Owner owner = service.findEntityById(Owner.class, (Long) newValue);
entity.setOwner(owner);
try {
service.createOrUpdateEntity(entity);
}
catch (Exception e) {
e.printStackTrace();
}
if(columnName.equals("Owner") {
RequestContext.getCurrentInstance().update("form:table:" + String.valueOf(alteredRow) + ":memberCell");
}
答案 0 :(得分:1)
您的问题不是组件的update
,实际上它们已经很好地更新了。
其submit
。
选择选项时,不会提交selectOneMenu。
您需要在其中放入一个ajax。
一个简单的<p:ajax/>
就可以做到。
<p:selectOneMenu value="#{entity.owner.id}" style="width:100%">
<f:selectItems value="#{ownerBean.owners}" var="owner" itemLabel="#{owner.name}" itemValue="#{owner.id}" />
<p:ajax/>
</p:selectOneMenu>