さて、私はstackoverflowやネットの他のさまざまな部分を数日間読んだことがありますが、私の問題を解決する解決策はまだ見つかりません.
基本的に、私は2 つの必須フィールドを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
の属性の値を使用してバッキング Bean を作成しました(必須メッセージの一部のみが表示されるという問題がありましたが、これでこの問題は解決しました) )
-に追加 -のイベントに
追加 -レンダリングされていないコンポーネントの検証に失敗したことが原因ではないことを確認
するために、必須フィールドを条件付きではない (属性を削除) にしてみました (ストローをつかむ...)rendered
ViewScoped
appendToBody="true"
p:dialog
if (!args.validationFailed)
oncomplete
p:dialog
rendered
編集:これは Chrome からのコンソール ダンプです。必須フィールドが null のフォームを送信すると、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
編集 2:以下は 2 つの JavaScript インポートのみです。どちらも、上記のui:define
およびを介してページに適用されるテンプレートに含まれています。ui:composition
<h:outputScript library="primefaces" name="jquery/jquery.js" />
<script type="text/javascript" src="#{request.contextPath}/resources/scripts/jscript.js" />
最初のインポートでは、ページに JavaScript を使用するコンポーネントがなくても、Primefaces は強制的に jQuery をページにインポートします。これは、カスタム スクリプトでjscript.js
jQuery を確実に使用できるようにするためです。
その他の情報:
JSF 2.1
Primefaces 3.4.2
Tomcat 6.0