如何在PrimeFaces中确定数据表是否处于行编辑状态?

如何在PrimeFaces中确定数据表是否处于行编辑状态?,primefaces,primefaces-datatable,Primefaces,Primefaces Datatable,我的DataTable的editMode是“行”。因此,用户单击铅笔图标开始编辑行,然后单击复选标记图标确认并结束编辑。它们对某些行执行相同的操作,然后单击“保存”按钮在一个事务中保存所有编辑的行。但是,在结束编辑之前,他们可以点击保存按钮;在这种情况下,我需要停止保存,并告诉他们在保存之前结束行编辑 问题是如何确定表是否处于编辑状态 我的DataTable是这样的: <p:dataTable id="myTable" value=

我的
DataTable
editMode
“行”
。因此,用户单击铅笔图标开始编辑行,然后单击复选标记图标确认并结束编辑。它们对某些行执行相同的操作,然后单击“保存”按钮在一个事务中保存所有编辑的行。但是,在结束编辑之前,他们可以点击保存按钮;在这种情况下,我需要停止保存,并告诉他们在保存之前结束行编辑

问题是如何确定表是否处于编辑状态

我的
DataTable
是这样的:

        <p:dataTable id="myTable"
                     value="#{myBean.dataModel}"
                     editMode="row"
                     editable="true"
                     var="row"
                     rowKey="#{row.id}"
                     rowIndexVar="rowIndex">
            <p:column>
                <p:rowEditor/>
            </p:column>
            <p:column headerText="label">
                <p:cellEditor>
                    <f:facet name="input">
                        <p:inputText value="#{row.label}" />
                    </f:facet>
                    <f:facet name="output">
                        <h:outputText value="#{row.label}"/>
                    </f:facet>
                </p:cellEditor>
            </p:column>
            <p:column headerText="name" >
                <p:cellEditor>
                    <f:facet name="input">
                        <p:inputText value="#{row.name}"/>
                    </f:facet>
                    <f:facet name="output">
                        <h:outputText value="#{row.name}"/>
                    </f:facet>
                </p:cellEditor>
            </p:column>
        </p:dataTable>

顺便说一句,有一个名为
editingRow
的属性,它的访问器
isEditingRow
setEditingRow
,我希望这是我的答案;但事实并非如此。似乎从未调用过
setEditingRow


我使用的是PrimeFaces 6.1和JSF 2.2。

使用行编辑Ajax事件
rowEdit
(行编辑时)、
rowEditInit
(行切换到编辑模式时)和
rowEditCancel
(行编辑取消时)跟踪表的编辑状态

最简单的形式是bean:

private int edits = 0;

public void startEdit(RowEditEvent event) {
  edits++;
}

public void stopEdit(RowEditEvent event) {
  edits--;
}

public boolean isEditing() {
  return edits > 0;
}
数据表:

<p:dataTable ...>
  <p:ajax event="rowEditInit" listener="#{myBean.startEdit}"/>
  <p:ajax event="rowEdit" listener="#{myBean.stopEdit}"/>
  <p:ajax event="rowEditCancel" listener="#{myBean.stopEdit}"/>
</p:dataTable>

如果仅仅计数还不够,您可以跟踪正在编辑的对象:

private Set<Object> editObjects = new HashSet<>();

public void startEdit(RowEditEvent event) {
  editObjects.add(event.getObject());
}

public void stopEdit(RowEditEvent event) {
  editObjects.remove(event.getObject());
}

public boolean isEditing() {
  return !editObjects.isEmpty();
}
private Set editObjects=new HashSet();
public void startEdit(RowEditEvent事件){
add(event.getObject());
}
公共作废停止编辑(RowEditEvent事件){
删除(event.getObject());
}
公共布尔isEditing(){
return!editObjects.isEmpty();
}

请注意,
RowEditEvent#getObject()
返回行数据。

这个想法不是一个解决方案,因为当我们有一些正在编辑的行并且数据表被更新时,当没有
rowEditCancel
rowEdit
事件被触发时,所有行都变成只读。因此,我们没有被编辑的行,一个积极的<代码>编辑< /代码>。例如,考虑到我们有一个DATABATE给雇员,包括他们的净收入作为一个列,并且有一个税率的输入文本。当税率改变时,数据表中的数据必须更新。我在答案中添加了一个对象变量。您可以通过将其与需要跟踪的只读列表进行比较来确定编辑状态。谢谢。但是,这是一样的。更新数据表时,
editObjects
可能不为空,而表将不再处于编辑模式。我发现这是我问题的根源,并在github中为其创建了一个问题:。当然,你的努力值得投票。再次感谢你。