Fab*_* B. 12 validation jsf primefaces jsf-2
我有一个CRUD页面,显示Primefaces数据表中查询(域对象列表)的数据.
<p:dataTable
id="negozi"
var="n"
value="#{nController.theListFromQuery}"
rowKey="#{n.id}"
selection="#{nController.selected}"
selectionMode="single">
<p:column headerText="Field1">
<h:outputText value="#{n.f1}" />
</p:column>
<p:column headerText="Field2">
<h:outputText value="#{n.f2}" />
</p:column>
<p:column style="width:4%">
<p:commandButton
actionListener="#{nController.prepareEdit(n)}"
update=":editDialogId"
oncomplete="editDialog.show()"
value="Edit" />
</p:column>
...
Run Code Online (Sandbox Code Playgroud)
通过单击编辑按钮,将显示一个对话框:
<p:dialog
header="Edit N"
widgetVar="editDialog"
id="editDialogId">
<h:form id="formDialog">
<h:panelGrid id="editDialogTable" columns="2" cellpadding="10" style="margin:0 auto;">
<p:outputLabel for="field1" value="F1:" />
<p:inputText id="field1" value="#{nController.selected.f1}" />
<p:outputLabel for="field2" value="F2:" />
<p:inputText id="field2" value="#{nController.selected.f2}" />
<p:commandButton
value="Confirm"
actionListener="#{nController.doEdit}"
update=":form"
oncomplete="editDialog.hide()"
rendered="#{nController.selected.id!=null}" />
...
Run Code Online (Sandbox Code Playgroud)
有用.现在我想让F1成为必填项目.
我将"required"属性添加到inputText字段,会发生什么?
当我尝试确认没有必填字段的表单时,实体不会被编辑(这是正确的),但对话框已关闭(这不对!)
当我重新打开对话框时,我可以在所需(和无效)字段上看到红色突出显示.
我想要的是在表单无效时阻止对话关闭.
我是否必须编写一些JS或者JSF会帮助我吗?
Bal*_*usC 35
PrimeFaces ajax响应将args对象放在具有validationFailed属性的范围内.你可以利用它.
oncomplete="if (args && !args.validationFailed) PF('editDialog').hide()"
Run Code Online (Sandbox Code Playgroud)
(args在请求期间抛出异常时,必须预先检查才能导致JS错误)
您可以将其重构为可重用的JS函数,如下所示.
oncomplete="hideDialogOnSuccess(args, 'editDialog')"
Run Code Online (Sandbox Code Playgroud)
function hideDialogOnSuccess(args, dialogWidgetVar) {
if (args && !args.validationFailed) {
PF(dialogWidgetVar).hide();
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
这篇文章现在已经有三年了,但我发现有帮助,所以我的发现可能对其他人有帮助.
至少在PF 5.x中,似乎BalusC提供的解决方案必须以两种方式进行修改.(1)在oncomplete事件处理器中为调用添加"args"参数,以及(2)使用PF primefaces原语来识别PF表中的窗口小部件.这是我正在使用的代码:
oncomplete="hideDialogOnSuccess(args, PF('editDialog'))"
function hideDialogOnSuccess(args, dialogWidgetVar) {
if (args && !args.validationFailed) {
dialogWidgetVar.hide();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9630 次 |
| 最近记录: |