可编辑 DataTable 中的 SelectBooleanCheckbox 不会改变

SelectBooleanCheckbox in editable DataTable doesn't change

我有一个可编辑的数据表 (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(并在其中输入 true/false 值)时,复选框会正确更新:

<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 版

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

根据涉及的JavaScript代码(saveCell() function in datatable.js),它只是在将新值提交给服务器之前将输入的新值与旧值进行比较,就像这样if (input.value != oldvalue) .但是,对于复选框(和单选按钮),输入值永远不会改变。总是一样的。只有选中的状态才应该触发浏览器实际将状态发送到服务器或不发送。

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

除了编辑 primefaces.js/datatable.js 之外没有办法修复它。你最好 report 把这个问题发给 PrimeFaces 的人,让他们解决。

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

<f:facet name="input">
    <h:inputHidden value="#{submodel.mapping}" />
    <h:selectBooleanCheckbox value="#{submodel.mapping}" onclick="$(this).prev().val(this.checked)" />
</f:facet>

对于 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>

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