8

我有一个可编辑的数据表(editMode = "cell")。

编辑自由文本字段和列表框非常简单。但是,我无法弄清楚如何编辑复选框字段。更具体地说,当我尝试编辑复选框选择时,输出方面中的数据在进行更改后未实现。

<p:dataTable id="submodels" var="submodel" value="#{projectMB.submodels}" 
             editable="true" editMode="cell" widgetVar="cellSubmodels">
  <p:column headerText="Mapping file">
    <p:cellEditor>
      <f:facet name="output">
        <h:selectBooleanCheckbox value="#{submodel.mapping}" onclick="return false;"
           style="width:96%" label="Root model" readonly="true"/>
      </f:facet>
      <f:facet name="input">
        <h:selectBooleanCheckbox value="#{submodel.mapping}" style="width:96%" 
           label="Root model"/>
      </f:facet>
    </p:cellEditor>
  </p:column>
</p:dataTable>

有点令人惊讶的是,当我将输入方面更改为 inputText (并在其中输入真/假值)时,复选框会正确更新:

<p:dataTable id="submodels" var="submodel" value="#{projectMB.submodels}" 
             editable="true" editMode="cell" widgetVar="cellSubmodels">
  <p:column headerText="Mapping file">
    <p:cellEditor>
      <f:facet name="output">
        <h:selectBooleanCheckbox value="#{submodel.mapping}" onclick="return false;"
           style="width:96%" label="Root model" readonly="true"/>
      </f:facet>
      <f:facet name="input">
        <p:inputText value="#{submodel.mapping}" style="width:96%" />
      </f:facet> 
    </p:cellEditor>
  </p:column>
</p:dataTable>

你能指出我做错了什么吗?我在 javascript 控制台和 Java 服务器端没有错误。

我正在使用 Primefaces 4.0 版

4

3 回答 3

8

这是 PrimeFaces 中的一个错误,或者至少是一个疏忽。

根据涉及的 JavaScript 代码(saveCell()函数 indatatable.js),它只会将输入的新值与旧值进行比较,然后再将新值提交给服务器,如下所示if (input.value != oldvalue)。但是,在复选框(和单选按钮)的情况下,输入值永远不会改变。它总是一样的。只有选中的状态才会触发浏览器实际将状态发送到服务器或不发送。

换句话说,所涉及的 JavaScript 代码应该检查它是否是一个复选框(或单选按钮),然后if (input.checked != oldchecked)改为检查。

除了编辑primefaces.js/之外,没有其他方法可以修复它datatable.js。您最好将此问题报告给 PrimeFaces 人员并让他们修复它。

同时,您可以通过将值复制到隐藏的输入字段来解决此问题。

<f:facet name="input">
    <h:inputHidden value="#{submodel.mapping}" />
    <h:selectBooleanCheckbox value="#{submodel.mapping}" onclick="$(this).prev().val(this.checked)" />
</f:facet>
于 2015-01-09T15:10:11.087 回答
1

在 PrimeFaces 7.0 中,我设计了一个相当简单的解决方法。(这也可能适用于早期的 PrimeFaces 版本 - 尚未对其进行测试。)

只需在复选框上启用 AJAX 并让它更新数据表:

(请注意,我使用p:selectBooleanCheckbox; 另请注意,这update="<datatable id>"是工作所必需的 - 你不能只插入<p:ajax />

  <f:facet name="input">
    <p:selectBooleanCheckbox value="#{submodel.mapping}" style="width:96%" 
       label="Root model">
      <p:ajax update="submodels" />
    </p:selectBooleanCheckbox>
  </f:facet>
于 2019-04-17T03:49:06.697 回答
0

PF 7.1 已修复此问题,请参阅此 PR:https ://github.com/primefaces/primefaces/pull/5095

于 2019-08-27T12:07:46.417 回答