1

アプリケーションでこの動作が発生する理由を知りたいだけです。

UI にプライムフェイスを使用し、ほとんどすべてのページがこのパターンに従っています。すべての CRUD 操作で AJAX を多用し、ダイアログを使用してユーザーに表示しました。

<ui:composition template="myTemplate.xhtml">
    <ui:define name="content">
        <ui:include
            src="/pages/CreateDialog.xhtml" />
        <ui:include
            src="/pages/UpdateDialog.xhtml" />
        <ui:include
            src="/pages/DeleteDialog.xhtml" />
    </ui:define>
</ui:composition>

私の唯一の懸念は、ダイアログで CRUD を実行した後、ユーザーが誤って F5 をクリックするか、ブラウザで更新した後、FF/Chrome および他のブラウザが常に言及されていることです。

To display this page, Firefox must send repeat action...

明らかに、これにより二重送信が発生します。以前は、古いアプリのこのシナリオで Post-Redirect-Get を使用していましたが、これは AJAX JSF の更新であるため、これを行うことはできません。

これの回避策は何ですか?これは正常ですか? ブラウザーの更新中に AJAX アクションが再度トリガーされるべきではないと考えました。

ヘルプ?

アップデート

このコードでダイアログを開いています

<p:commandButton value="Add" 
        onclick="createWidget.show();"
        update=":CreateForm"
        action="#{MyBean.add}" 
        />

私の作成ダイアログはこれを使用します

<p:dialog  header="Create">
    <h:form id="CreateForm" prependId="false">
        <p:commandButton value="Add" icon="ui-icon-plus"
            actionListener="#{MyBean.add}"
            update=":messageGrowl" 
            oncomplete="closeDialogIfSucess(xhr, status, args, createWidget 'createDialogId')"/>
    </h:form>
</p:dialog>

私は実際にこのサイトのページをフォローしています...完全な WebApplication JSF EJB JPA JAAS

4

1 に答える 1

2

コールバック メソッドで JavaScript エラーが発生すると、このような動作になることはすでに数回経験しています。コールバック署名を修正した後に消えた問題を再現できました。

oncomplete="closeDialogIfSucess(xhr, status, args, createWidget, 'createDialogId')"

あなたのJavaScript関数の署名に応じて:

function closeDialogIfSucess(xhr, status, args, createWidget, dialogid)

(JavaScript 呼び出しに 3 つのパラメーターしかない場合は、oncomplete呼び出しを修正してください)

無関係:特定のダイアログを閉じるためにこの機能を使用していると思います。それを行う別の方法はwidgetVar、ダイアログに属性を割り当てることです。

<p:dialog id="testDialog"  header="Create" widgetVar="createWidget">
    <h:form id="CreateForm" prependId="false">
        ...
    </h:form>
</p:dialog>

オブジェクトはコールバック関数でダイアログを表すため、ダイアログの関数をwidgetVar呼び出して閉じることができます。hide()

function closeDialogIfSucess(xhr, status, args, createWidget) {
    if(args.validationFailed || !args.loggedIn) {  
        jQuery('#testDialog').effect("shake", { times:3 }, 100);  
    } else {  
        createWidget.hide();  
    }  
}
于 2012-11-08T06:20:19.713 に答える