可编辑DataTable中的SelectBooleanCheckbox不会更改
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可编辑DataTable中的SelectBooleanCheckbox不会更改相关的知识,希望对你有一定的参考价值。
我有一个可编辑的dataTable(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>
有点令人惊讶的是,当我将输入面更改为输入文本(并在其中输入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并让它更新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>
以上是关于可编辑DataTable中的SelectBooleanCheckbox不会更改的主要内容,如果未能解决你的问题,请参考以下文章
如何根据条件使primefaces datatable列可编辑
在 onblur 期间始终从可编辑的 DataTable 中检索旧值(但不是新值)
如何在 Bootstrap DataTable 列网格上实现可编辑弹出框