12

Primefacesデータテーブルのクエリ(ドメインオブジェクトのリスト)からのデータを表示するCRUDページがあります。

<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>
...

編集ボタンをクリックすると、ダイアログが表示されます。

    <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}" />                  
...

できます。ここで、F1を必須フィールドにします。

inputTextフィールドに「required」属性を追加するとどうなりますか?

必須フィールドなしでフォームを確認しようとすると、エンティティは編集されません(そうです)が、ダイアログは閉じられます(そうではありません!)

ダイアログを再度開くと、必須(および無効)フィールドに赤いハイライトが表示されます。

フォームが無効な場合にダイアログが閉じないようにする必要があります。

JSを作成する必要がありますか、それともJSFが役に立ちますか?

4

4 に答える 4

40

PrimeFaces ajax レスポンスはargs、プロパティを持つスコープにオブジェクトを配置しvalidationFailedます。あなたはそれを利用することができます。

oncomplete="if (args &amp;&amp; !args.validationFailed) PF('editDialog').hide()"

(argsリクエスト中に例外がスローされたときに JS エラーが発生しないように、事前チェックが必要です)

次のように、再利用可能な JS 関数にリファクタリングできます。

oncomplete="hideDialogOnSuccess(args, 'editDialog')"
function hideDialogOnSuccess(args, dialogWidgetVar) {
    if (args && !args.validationFailed) {
        PF(dialogWidgetVar).hide();
    }
}
于 2013-01-14T22:43:17.480 に答える
6

この投稿は現在 3 年前のものですが、役に立ちました。

少なくとも PF 5.x では、BalusC が提供するソリューションを 2 つの方法で変更する必要があるようです。(1) oncomplete イベント ハンドラの呼び出しに「args」引数を追加し、(2) PF プライムフェイス プリミティブを使用して PF テーブル内のウィジェットを識別します。私が使用しているコードは次のとおりです。

oncomplete="hideDialogOnSuccess(args, PF('editDialog'))"

function hideDialogOnSuccess(args, dialogWidgetVar) {
    if (args && !args.validationFailed) {
        dialogWidgetVar.hide();
    }
}
于 2016-02-15T16:11:36.123 に答える