3

OmniFacesFullAjaxExceptionHandlerと PrimeFacesを使用しています。errorPage.xhtml次のようにコマンドボタンを追加しました。

<h:form>
    <p:commandButton id="logoutButtonId" value="Redirect" actionListener="#{userMB.logout()}">
</h:form>

エラーページは正しく表示されますが、ボタンはメソッドを起動しません #{userMB.logout()}。これは、私のセットアップで何が起こるかを理解していることです:

  1. エラーが発生した場合は、FullAjaxExceptionHandlerうまく表示されますerrorPage.xhtml
  2. 追加したボタンをクリックすると、更新が行われたかのように、ページが同じデータで更新されます。
  3. ボタンをもう一度クリックすると、マネージド Bean メソッドがトリガーされます。

Bean メソッドが呼び出されるのは 2 回目のクリックだけです。最初のロード時に、Bean メソッドがオブジェクトにバインドされないようです。

エラー ページにコマンド ボタンを追加して、使用時にアクション/アクション リスナーを HTML コンポーネントに適切にバインドするにはどうすればよいFullAjaxExceptionHandlerですか?

4

2 に答える 2

2

この問題には、次の 2 つの原因が考えられます。

  1. Internet Explorer を使用している場合、これは PrimeFaces@allが IE ベースのブラウザで必要な ajax JavaScript の初期化に失敗したこととして認識できます。これはここで答えられます:オブジェクトは、プライムフェイス オムニフェイス タイムアウトの組み合わせでこのプロパティまたはメソッドをサポートしていません

  2. 別のブラウザーを使用していて、JSF 標準を使用<f:ajax>して ajax アクションをトリガーしていjsf.jsた場合、@all. これはここで回答されています:エラー ページのバグ レポート フォーム

これらのスクリプトは、エラー ページ自体ではなく、ajax アクションが呼び出されるページに配置する必要があることに注意してください。

于 2013-01-11T13:54:15.917 に答える
2

This was what worked for me, a combination of the approach mentioned by BalusC in his answer below. It works in both IE and Firefox. It might need some tweaking for some cases but since the error page I got only has one form, I didn't bother to loop thru the forms.

var originalPrimeFacesAjaxResponseFunction = PrimeFaces.ajax.AjaxResponse;
PrimeFaces.ajax.AjaxResponse = function(responseXML) {
    var newViewRoot = $(responseXML.documentElement).find("update[id='javax.faces.ViewRoot']").text();

    if (newViewRoot) {
        var viewState = $(responseXML.documentElement).find("update[id='javax.faces.ViewState']").text();

        $('head').html(newViewRoot.substring(newViewRoot.indexOf("<head>") + 6, newViewRoot.indexOf("</head>")));
        $('body').html(newViewRoot.substring(newViewRoot.indexOf("<body>") + 6, newViewRoot.indexOf("</body>")));
        if (!$('input').attr("javax.faces.ViewState")){
            var hidden = document.createElement("input");
            hidden.setAttribute("type", "hidden");
            hidden.setAttribute("name", "javax.faces.ViewState");
            hidden.setAttribute("value", viewState);
            hidden.setAttribute("autocomplete", "off");
            $('form').append(hidden);
        }
    } else {
        originalPrimeFacesAjaxResponseFunction.apply(this, arguments);
    }
};
于 2013-01-13T05:58:46.487 に答える