0

を作成するための PrimeFaces ダイアログを持つ JSF ページがいくつかありますPerson。このダイアログにはファイルのアップロードが含まれているため、AJAX を使用したくありません。が作成されると、ダイアログは閉じられますPerson。が作成されていない場合Person(検証が失敗した場合など)、ダイアログが表示されます。

を使用してこれを行う人を見てきましvisible="#{not empty facesContext.messages}"たが、呼び出されたメソッドはFacesMessageいずれにせよ a を返すため、これを使用することはできません。

私が今持っているアイデアは、ビュー パラメーター (たとえば、showDialog) を生成して使用することvisible="#{param.showDialog}"です。

ナビゲーション ケースを使用してみましたが、メソッドが複数のページから呼び出されるため、ビュー パラメーターのみを追加する汎用ナビゲーション ケースを作成できません。これはアイデアです:

<navigation-rule>
    <from-view-id>*</from-view-id>
    <navigation-case>
        <from-action>#{personBean.create}</from-action>
        <from-outcome>true</from-outcome>
        <to-view-id>#{from-view-id}</to-view-id>
        <redirect>
            <view-param>
                <name>showDialog</name>
                <value>#{form-outcome}</value>
            </view-param>
        </redirect>
    </navigation-case>
</navigation-rule>

ナビゲーション ケースを使用する場合のもう 1 つの問題は、ダイアログが複合タグであり、アクションが属性を使用して提供されることです。上記のようなナビゲーションケースを使用すると、 というメッセージが表示されますUnable to find matching navigation case with from-view-id '/test.xhtml' for action '#{cc.attrs.saveAction}' with outcome 'true'

最善/最も簡単な解決策は、ビュー パラメータをメソッドに追加することだと思います。ただし、requestmap は不変であり、String を含むものを返すこと?showDialog=trueもできません。

4

2 に答える 2

0

ナビゲーション ルールで処理するのではなく、Primefaces Showcases の Login Example のようにします。ご覧のとおり、検証が失敗してもダイアログは開いたままになり、送信アクションが成功すると閉じます。

于 2012-09-08T22:39:27.520 に答える
0

ビューパラメーターのアイデアがなくても機能するソリューションを見つけました。

このボタンを使用してフォームを送信するには、p:commandButtonAJAX を使用します。このボタンは、フィールドの設定、フィールドの検証、および入力フィールドのコンテナーの更新のみを行います。幸い、PrimeFaces はargs.validationFailed検証が失敗したかどうかを示す JavaScript 値 ( ) を返します。

保存ボタンをクリックすると、フィールドは AJAX を介して検証されるため、ダイアログを開いたままにします。検証に合格したら、JavaScript を使用して非 AJAX リンクをクリックします。

JSF:

<p:commandButton value="Save" update="containerOfValues"
    oncomplete="afterValidation(xhr, status, args)" />
<p:commandLink ajax="false" action="#{cc.attrs.saveAction}"
    style="display:none" binding="#{saveLink}" />

JavaScript:

function afterValidation(xhr, status, args)
{
    if (!args.validationFailed)
    {
        $("[id='#{saveLink.clientId}']").click();
    }
}
于 2012-09-09T12:55:43.107 に答える