好的,所以我已经阅读了stackoverflow和网络的其他各个部分几天,还没有找到解决我问题的解决方案。
基本上,我在h:form
中有一个p:dialog
,其中包含两个必填字段。填写字段后,表单将成功提交并关闭对话框。当其中一个或两个字段留空时,必填字段验证将失败,并使用相应的必需消息更新h:messages
中的p:dialog
组件。但是,当验证失败时,AJAX调用似乎永远不会“完成”并阻止后续调用被执行。我的p:ajaxStatus
组件永远不会从屏幕上消失,这表明某些挂起某处。这可以通过刷新页面来解决,此时所有其他AJAX组件再次开始运行。
此外,我会注意到此p:dialog
位于ui:define
中的ui:composition
,将其转储到主模板中。 不嵌套在另一个h:form
中。
<p:dialog id="dlgDecision"
header="Decision"
widgetVar="dialogDecision"
modal="false"
resizable="false"
appendToBody="true">
<h:form id="fDlgDecision">
<h:messages id="msgDlgDecision" binding="#{msgform.messages}" errorClass="errormsg" infoClass="infomsg1" layout="table"/>
<h:outputFormat rendered="#{studentdetailsform.decisionAction == 'A'}">
<h:outputText value="Select an accept and admit code."/>
</h:outputFormat>
<h:outputFormat rendered="#{studentdetailsform.decisionAction == 'C'}">
<h:outputText value="Select a cancel and reason code."/>
</h:outputFormat>
<h:panelGrid columns="1">
<h:selectOneMenu id="apdcCode"
value="#{studentDetails.apdcCode}"
required="true"
requiredMessage="Please choose a decision code.">
<f:selectItem itemLabel="Select Decision Code"/>
<f:selectItems value="#{apdcCodes.apdcCodeList}"
var="apdc"
itemValue="#{apdc.apdcCode}"
itemLabel="#{apdc.apdcCode} - #{apdc.apdcDesc}"/>
</h:selectOneMenu>
<h:selectOneMenu id="admtCode"
value="#{studentDetails.admtCode}"
required="#{studentdetailsform.decisionAction == 'A'}"
requiredMessage="Please choose an admit code."
rendered="#{studentdetailsform.decisionAction == 'A'}">
<f:selectItem itemLabel="Select Admit Code"/>
<f:selectItems value="#{admtCodes.admtCodeList}"
var="admt"
itemValue="#{admt.admtCode}}"
itemLabel="#{admt.admtCode} - #{admt.admtDesc}"/>
</h:selectOneMenu>
<h:selectOneMenu id="wrsnCode"
value="#{studentDetails.wrsnCode}"
required="#{studentdetailsform.decisionAction == 'C'}"
requiredMessage="Please choose a reason code."
rendered="#{studentdetailsform.decisionAction == 'C'}">
<f:selectItem itemLabel="Select Reason Code"/>
<f:selectItems value="#{wrsnCodes.wrsnCodeList}"
var="wrsn"
itemValue="#{wrsn.wrsnCode}"
itemLabel="#{wrsn.wrsnCode} - #{wrsn.wrsnDesc}"/>
</h:selectOneMenu>
<p:commandButton id="decisionSubmit"
value="Submit Decision"
type="submit"
action="#{mainform.saveDecision}"
ajax="true"
partialSubmit="true"
process="@form"
update="@form msgDlgDecision"
oncomplete="if (!args.validationFailed) dialogDecision.hide()"/>
</h:panelGrid>
</h:form>
</p:dialog>
我在调试和故障排除方面已经完成的一些事情:
- 将h:form
移至p:dialog
- 使必填字段rendered
上的ViewScoped
属性的值具有支持bean(仅显示一些所需消息的问题,这解决了这个问题)
- 将appendToBody="true"
添加到p:dialog
- 在if (!args.validationFailed)
的{{1}}事件中添加了oncomplete
- 尝试使所需字段不是有条件的(删除p:dialog
属性)以确保这不是由非渲染组件上的验证失败引起的(抓住吸管......)
编辑:以下是Chrome的控制台转储。提交包含null必填字段的表单时会抛出Javascript错误。
rendered
编辑2:以下是仅有的两个JavaScript导入,这两个导入都在我的模板中,该模板通过上面提到的Uncaught SyntaxError: Unexpected token { jquery.js:14
bG.extend.parseJSON jquery.js:14
PrimeFaces.ajax.AjaxUtils.handleResponse primefaces.js:1
PrimeFaces.ajax.AjaxResponse primefaces.js:1
j.success primefaces.js:1
bZ jquery.js:14
b7.fireWith jquery.js:14
ca jquery.js:21
bZ
和ui:define
应用于页面。
ui:composition
第一次导入将强制Primefaces将jQuery导入页面,即使页面上没有使用JavaScript的组件也是如此。这是为了允许<h:outputScript library="primefaces" name="jquery/jquery.js" />
<script type="text/javascript" src="#{request.contextPath}/resources/scripts/jscript.js" />
中的自定义脚本可靠地使用jQuery。
其他信息:
JSF 2.1
Primefaces 3.4.2
Tomcat 6.0
答案 0 :(得分:0)
不要手动导入jQuery.js,因为这已经由PrimeFaces隐式完成(它使用了jQuery)。你可以删除该行。
此外,您应该看到一些导入自定义js文件的示例,例如h:outputScript
,例如:
<h:outputScript library="scripts" name="jscript.js" />
但这可能不是你问题的原因,这只是提示更好的JSF设计。
答案 1 :(得分:0)
今天,在我下载了PrimeFaces 4.0快照(2013-05-09)并测试了我的应用后,Google Chrome中出现了类似的错误。
基本上,我必须通过JSON从bean发送到p:schedule的数据中删除单引号。由于错误提到了“解析JSON”和“意外”(意外的单引号),我转到数据的数据表视图(而不是p:schedule),并认识到某些数据嵌入了单引号。所以,我从数据中删除了单引号,这解决了我的问题。
请点击下面的论坛主题网址。
答案 2 :(得分:0)
我的应用程序遇到了完全相同的问题。真正的问题是重复的jar问题。
我的应用程序中有两个primefaces jar,一个位于WEB-INF / lib目录下,另一个位于ear / lib目录下。一旦我删除了WEB-INF下的那个,一切都开始按预期工作了。
您可以通过搜索js例外在网上找到解决方案。