p:cellEditor修改disabled属性后未正确更新如何解决?
问题根因
- 组件更新路径错误:你当前使用的相对ID路径无法正确定位到目标cellEditor组件,导致点击后属性没有被刷新。
- 仅修改disabled属性不足以激活编辑状态:cellEditor默认显示output facet,解除禁用后需要手动触发进入编辑模式。
- 全局disabled变量会影响所有行:你当前的disabled是Bean的全局属性,点击任意行的编辑会导致所有行的cellEditor同时解除禁用。
解决方案
1. 修正前端标识与更新路径
给外层表单添加唯一ID,给dataTable添加widgetVar方便调用客户端API,update使用绝对路径定位组件。
2. 调整状态存储维度
将disabled属性放到行级实体类中,实现每行编辑状态独立。
3. 手动触发单元格进入编辑模式
在commandLink的oncomplete事件中调用PrimeFaces客户端API激活对应单元格的编辑状态。
完整代码示例
前端页面
<!-- 外层表单必须加ID --> <h:form id="mainForm"> <h:panelGrid> <p:dataTable id="datatableId" var="obj" value="#{myBean.dataList}" editable="true" editMode="cell" rowKey="#{obj.id}" rowIndexVar="rowindex" widgetVar="dtWidget"> <!-- 其他列 --> <p:column> <p:cellEditor id="targetEditorId" disabled="#{obj.disabled}"> <f:facet name="output"> <h:outputText value="#{obj.foo}"/> </f:facet> <f:facet name="input"> <p:inputNumber value="#{obj.foo}"/> </f:facet> </p:cellEditor> </p:column> <p:column> <p:commandLink value="edit" process="@this" action="#{myBean.linkAction(rowindex)}" update=":mainForm:datatableId:#{rowindex}:targetEditorId" <!-- getCell第二个参数为cellEditor所在的列索引,从0开始计数,根据实际列数调整 --> oncomplete="PF('dtWidget').showCellEditor(PF('dtWidget').getCell(#{rowindex}, 1))"/> </p:column> </p:dataTable> </h:panelGrid> </h:form>
行实体类
public class MyObj { private Integer id; // 其他属性 private BigDecimal foo; // 行级编辑禁用标识,默认true初始禁用 private boolean disabled = true; // 所有属性的getter、setter }
后端Bean代码
private List<MyObj> dataList; @PostConstruct public void init() { // 初始化dataList数据 } public void linkAction(int rowIndex) { // 仅修改当前点击行的禁用状态 dataList.get(rowIndex).setDisabled(false); } // dataList的getter、setter
补充说明
为什么反向设置可以生效?因为初始disabled为false时,组件默认处于可编辑状态,修改为true的逻辑只需要禁用组件,不需要额外触发编辑状态切换,只要update路径能生效就会有反馈。而你需要的初始禁用后激活的逻辑,需要同时完成属性更新和编辑状态触发两个步骤才能正常工作。
内容的提问来源于stack exchange,提问作者Simon Fernandes
相关产品推荐
相关产品推荐

