Primefaces 3.5,Mojarra 2.1.14.这是我的PF数据表,它包含一个名为'automatic'的不可编辑的布尔列,以及可编辑的'label'列:
<p:dataTable value="#{bean.contents}" paginator="true" var="row"
editable="true" editMode="cell" rows="25" rowsPerPageTemplate="10,25,50" id="list">
<p:column>
<f:facet name="header"><h:outputText value="header1" /></f:facet>
<p:selectBooleanCheckbox value="#{row.automatic}" disabled="true" id="isAutomatic"></p:selectBooleanCheckbox>
</p:column>
<p:column>
<f:facet name="header"><h:outputText value="header2" /></f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{row.label}"></h:outputText>
</f:facet>
<f:facet name="input">
<p:inputText value="#{row.label}"></p:inputText>
</f:facet>
</p:cellEditor>
</p:column>
<p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel}" update="isAutomatic"/>
</p:dataTable>
Run Code Online (Sandbox Code Playgroud)
单元格编辑事件监听器:
public void onEditLabel(CellEditEvent event) {
Object oldValue = event.getOldValue();
Object newValue = event.getNewValue();
if(newValue != null && !newValue.equals(oldValue)) {
DataTable s = (DataTable) event.getSource();
MyEntity d = (MyEntity) s.getRowData();
try {
d.setAutomatic(false);
myDAO.save(d);
addMessage("Change saved!");
} catch (Exception ex) {
addErrorMessage("Label could not be saved!");
getFacesContext().validationFailed();
}
}
}
Run Code Online (Sandbox Code Playgroud)
单元格编辑器工作,将数据发送到侦听器,并将其正确保存到数据库.单元格编辑事件监听器也会清除"自动"标志,并将其正确保存到数据库中.问题是客户端上没有更新"自动"复选框.
我也试过了
<p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel}" update="list"/>
Run Code Online (Sandbox Code Playgroud)
这正确地更新了复选框,但也导致焦点丢失,并浪费带宽.
在触发cellEdit事件后,如何仅更新特定单元格?
您在某个特定的行或列中p:ajax
标记为p:dataTable
no,因此您可以轻松更新某些相对组件ID.您可以帮助RequestContext
更新单元格中的特定组件.因此,请update
从p:ajax
您的onEditLabel
方法中删除并添加:
RequestContext.getCurrentInstance().update(
s.getClientId(FacesContext.getCurrentInstance()) +
":" + event.getRowIndex() +
":isAutomatic"
);
Run Code Online (Sandbox Code Playgroud)
如您所见,单元格内部组件的ID在您指定的ID之前具有行号.
归档时间: |
|
查看次数: |
26905 次 |
最近记录: |