JSF PrimeFaces - 单击按钮时保存所选表格单元格的值
JSF PrimeFaces - Save value of selected tablecell on buttonclick
先决条件:
- JSF 2.1
- Primefaces 5.2
- 玻璃鱼 3.1
故事:
我得到一个数据table 显示一些 editable 值。
列的数量是动态的。
在相同的表单中,有一个按钮调用我的 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>
问题:
在 table 单元格正在编辑且尚未失去焦点时按下保存按钮时,table 单元格的输入文本中的新值不会被写回进入我的豆子,因此不会被保存。
问题:
如何在执行按钮操作之前将数据写回我的支持 bean?
此行为是由 ajax 事件的错误排序引起的。在打开单元格编辑器的同时调用命令按钮时,命令按钮的 ajax 事件将在单元格编辑的 ajax 事件之前触发。
因此我们想围绕它们进行交换。在不编辑 PrimeFaces 源代码的情况下,您可以通过在打开单元格编辑器时显式调用 <p:dataTable>
小部件的 saveCell()
函数来实现此目的。
所以,给定一个
<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()
。
另一种不太优雅的方法是显式调用 <p:dataTable>
小部件的 showCellEditor()
函数,而不传递忽略异常的 try-catch
块中的预期目标单元格。
onclick="try{PF('wigVardataTable').showCellEditor()}catch(ignore){}"
它将首先保存任何打开的单元格,然后抛出一个错误,指出没有新的目标单元格被指定为参数,但可以忽略,如上所示。
请注意,无论您使用 <p:columns>
还是 <p:column>
,也无论您使用普通模型还是过于复杂的模型,这一切都有效;)这个技巧在您的 PrimeFaces 5.2 版本和当前的 PrimeFaces 6.0 版本。
如果您有其他带有单元格 editMode 的数据表,这是受 BalusC 回答启发的通用解决方案:
<script type="application/javascript">
function saveAllCellsBeforeSubmit() {
for (var widgetName in PrimeFaces.widgets) {
if (PrimeFaces.widgets[widgetName].hasOwnProperty('cfg') && PrimeFaces.widgets[widgetName].cfg.hasOwnProperty('editMode') && PrimeFaces.widgets[widgetName].cfg.editMode === 'cell') {
var d = PF(widgetName);
var c = d.jq.find('td:has(.ui-cell-editor-input:visible)');
if (c.length) {
d.saveCell(c);
}
}
}
}
</script>
先决条件:
- JSF 2.1
- Primefaces 5.2
- 玻璃鱼 3.1
故事:
我得到一个数据table 显示一些 editable 值。 列的数量是动态的。 在相同的表单中,有一个按钮调用我的 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>
问题:
在 table 单元格正在编辑且尚未失去焦点时按下保存按钮时,table 单元格的输入文本中的新值不会被写回进入我的豆子,因此不会被保存。
问题:
如何在执行按钮操作之前将数据写回我的支持 bean?
此行为是由 ajax 事件的错误排序引起的。在打开单元格编辑器的同时调用命令按钮时,命令按钮的 ajax 事件将在单元格编辑的 ajax 事件之前触发。
因此我们想围绕它们进行交换。在不编辑 PrimeFaces 源代码的情况下,您可以通过在打开单元格编辑器时显式调用 <p:dataTable>
小部件的 saveCell()
函数来实现此目的。
所以,给定一个
<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()
。
另一种不太优雅的方法是显式调用 <p:dataTable>
小部件的 showCellEditor()
函数,而不传递忽略异常的 try-catch
块中的预期目标单元格。
onclick="try{PF('wigVardataTable').showCellEditor()}catch(ignore){}"
它将首先保存任何打开的单元格,然后抛出一个错误,指出没有新的目标单元格被指定为参数,但可以忽略,如上所示。
请注意,无论您使用 <p:columns>
还是 <p:column>
,也无论您使用普通模型还是过于复杂的模型,这一切都有效;)这个技巧在您的 PrimeFaces 5.2 版本和当前的 PrimeFaces 6.0 版本。
如果您有其他带有单元格 editMode 的数据表,这是受 BalusC 回答启发的通用解决方案:
<script type="application/javascript">
function saveAllCellsBeforeSubmit() {
for (var widgetName in PrimeFaces.widgets) {
if (PrimeFaces.widgets[widgetName].hasOwnProperty('cfg') && PrimeFaces.widgets[widgetName].cfg.hasOwnProperty('editMode') && PrimeFaces.widgets[widgetName].cfg.editMode === 'cell') {
var d = PF(widgetName);
var c = d.jq.find('td:has(.ui-cell-editor-input:visible)');
if (c.length) {
d.saveCell(c);
}
}
}
}
</script>