JSF PrimeFaces - 在buttonclick上保存所选tablecell的值

时间:2016-08-29 06:01:47

标签: jsf primefaces datatable focus

先决条件:

  • JSF 2.1
  • Primefaces 5.2
  • Glassfish 3.1

故事:

我有一个显示一些可编辑值的数据表。 列数是动态的。 在同一个表单中是一个按钮,调用我的bean的保存操作来保存所有编辑的数据。 它自己的功能完全正常

实现:

<p:dataTable id="dataTable" scrollable="true"
    widgetVar="wigVardataTable"
    value="#{myBean.dataList}"
    var="data"
    editable="true"
    editMode="cell"
    rowKey="rowkey">        
   <p:columns var="col"
     value="#{myModel.columnList}"
     style="font-size: 12px">
     <f:facet name="header">
        <h:outputText
          value="#{col.header}" />
     </f:facet>
     <p:cellEditor>
        <f:facet name="output">
          <h:outputText
            value="#{myModel.getValueForTableCell(data, col).value}" />
        </f:facet>
          <f:facet name="input">
            <p:inputText
              id="inputTxt"
              value="#{myModel.getValueForTableCell(data, col).value}"
              style="width:100%">       
            </p:inputText>
        </f:facet>
      </p:cellEditor>
    </p:columns>
  </p:dataTable>

问题:

当正在编辑表格单元格时按下保存按钮并且还没有失去焦点时,表格单元格的输入文本中的新值将不会写回到我的bean中,因此不会保存。

问题:

如何在执行按钮操作之前将数据写回我的支持bean?

2 个答案:

答案 0 :(得分:5)

此行为是由ajax事件的错误排序引起的。在打开单元格编辑器的同时调用命令按钮时,在单元格编辑的ajax事件之前触发命令按钮的ajax事件。

我们因此想换掉他们。在不编辑PrimeFaces源代码的情况下,您可以通过在单元格编辑器打开时显式调用saveCell()小部件的<p:dataTable>函数来实现此目的。

所以,给出一个

<h:form>
    <p:dataTable ... widgetVar="wigVardataTable" />
    <p:commandButton ... />
</h:form>

您可以通过将以下onclick添加到<p:commandButton>来实现所需的行为:

onclick="var d=PF('wigVardataTable'), c=d.jq.find('td:has(.ui-cell-editor-input:visible)'); if(c.length)d.saveCell(c)"

基本上,它首先使用开放单元格编辑器找到单元格,然后在其上调用saveCell()

另一种不那么优雅的方法是显式调用showCellEditor()小部件的<p:dataTable>函数,而不会在忽略异常的try-catch块中传递预期的目标单元格。

onclick="try{PF('wigVardataTable').showCellEditor()}catch(ignore){}"

它将首先保存任何已打开的单元格,然后抛出一个错误,指出没有新的目标单元格被指定为参数,但可以忽略它,如上所示。

值得注意的是,无论您使用<p:columns>还是<p:column>,无论您使用的是普通模型还是过于复杂的模型,这一切都能正常运行;)这个技巧在您的PrimeFaces 5.2版本和当前的PrimeFaces 6.0版本。

答案 1 :(得分:0)

这是一个受BalusC回答的通用解决方案,如果你有其他数据表与单元格editMode:

sites: JSONArray