如何更新Primefaces数据表中的特定行

如何更新Primefaces数据表中的特定行,primefaces,Primefaces,Primefaces 3.5,Mojarra 2.1.14。这是我的PF数据表,它包含一个名为“自动”的不可编辑布尔列和一个可编辑的“标签”列: 单元格编辑事件侦听器: public void onEditLabel(CellEditEvent事件){ 对象oldValue=event.getOldValue(); Object newValue=event.getNewValue(); if(newValue!=null&!newValue.equals(oldValue)){ DataT

Primefaces 3.5,Mojarra 2.1.14。这是我的PF数据表,它包含一个名为“自动”的不可编辑布尔列和一个可编辑的“标签”列:


单元格编辑事件侦听器:

public void onEditLabel(CellEditEvent事件){
对象oldValue=event.getOldValue();
Object newValue=event.getNewValue();
if(newValue!=null&!newValue.equals(oldValue)){
DataTables=(DataTable)event.getSource();
MyEntity d=(MyEntity)s.getRowData();
试一试{
d、 设置自动(假);
myDAO.save(d);
添加消息(“已保存更改!”);
}捕获(例外情况除外){
addErrorMessage(“无法保存标签!”);
getFacesContext().validationFailed();
}
}
}   
单元编辑器工作,将数据发送到侦听器,并将其正确地持久化到数据库。单元格编辑事件侦听器也会清除“自动”标志,并将其正确持久化到数据库中。问题是客户端上的“自动”复选框未更新

我也试过了


它正确地更新了复选框,但也会导致焦点丢失,并浪费带宽


在触发cellEdit事件后,如何仅更新一个特定的单元格?

p:ajax
标记位于
p:dataTable
no的特定行或列中,因此您可以轻松地更新一些相关组件id。您可以借助
RequestContext
更新单元格中的特定组件。因此,从
p:ajax
中删除
update
,并将其添加到您的
onEditLabel
方法中:

RequestContext.getCurrentInstance().update(
s、 getClientId(FacesContext.getCurrentInstance())+
“:”+event.getRowIndex()+
“:isAutomatic”
);

正如您所看到的,单元格内组件的id在您分配id之前有行号。

我相信您可以解决这个问题,而无需知道您希望更新的组件id的详细信息。您可以将其作为参数传递给bean

首先,绑定要更新的组件。您实际上不需要该组件绑定到的bean。您只需要定义一些值,稍后在JSF中可以使用这些值来标识这个组件。因此,在您的情况下,您可以执行以下操作:

<p:selectBooleanCheckbox binding="#{isAutomaticComponent}" value="#{row.automatic}" disabled="true" id="isAutomatic"></p:selectBooleanCheckbox>

谢谢这是可行的,但肯定不是最佳做法。首先,我依赖于特定的组件id命名约定。其次,我的控制器bean现在包含前端逻辑(视图ID)。最好的解决方案是将这样一个特性添加到PF数据表中。叹息.)我不完全同意你的看法。支持bean与表示层紧密耦合(例如,从AJAX侦听器调用支持bean方法)。如果您将业务逻辑放在backingbean中,那将是不好的。我同意在backingbean中加入id不是很好,但现在我看不到任何简单的解决方案。我同意没有简单的解决方案,这将不得不这样做。再次感谢!这对我不起作用,你能告诉我什么是问题吗?自《迁移指南》中详述的PF 7.0以来,PrimeFaces类取代了RequestContext,你真的尝试过吗?我想知道组件绑定是否能在datatable中正常工作。另外,我相信您可以使用类似于#{component.clientId}的东西,请看我的情况有点不同,所以我没有完全尝试过这个场景,但我做了一些非常类似的事情。我相信这将适用于这里发布的场景。是的。组件绑定在datatable中工作。这更接近我的场景,因为我想更新表中一行中按钮的ID,但由于表中的行是动态的,因此按钮的ID也是动态的,所以很难更新。以这种方式传递组件的ID是我能找到的最佳解决方案。
<p:ajax event="cellEdit" process="@this" listener="#{myBean.onEditLabel(isAutomaticComponent.clientId)}" />
public void onEditLabel(CellEditEvent event, String idOfComponentToUpdate) {
...
RequestContext.getCurrentInstance().update(idOfComponentToUpdate);
...