可编辑DataTable中的SelectBooleanCheckbox不会更改

时间:2015-01-09 14:23:16

标签: jsf-2 primefaces datatable tablecelleditor selectbooleancheckbox

我有一个可编辑的数据表(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>

有点令人惊讶,当我将输入facet更改为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版

3 个答案:

答案 0 :(得分:7)

这是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>

答案 1 :(得分:0)

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

只需在复选框上启用AJAX并更新dataTable:

(请注意,我使用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>

答案 2 :(得分:0)

此问题已针对PF 7.1进行了修复,请参见以下PR:https://github.com/primefaces/primefaces/pull/5095