2013-01-11 29 views
2

我正在使用OmniFaces FullAjaxExceptionHandler和PrimeFaces。我在errorPage.xhtml添加一個命令按鈕,如下所示:如何在FullAjaxExceptionHandler所顯示的錯誤頁面中調用p:commandButton?

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

錯誤頁面才能正確顯示,但按鈕不火的方法#{userMB.logout()}。 這是我理解我的設置發生了什麼:

  1. 如果發生錯誤,FullAjaxExceptionHandler很好地顯示errorPage.xhtml
  2. 如果我點擊我添加的按鈕,頁面會更新相同的數據,就像刷新發生一樣。
  3. 如果我再次點擊按鈕,那麼將觸發managed bean方法。

只有在第二次點擊時纔會調用bean方法。似乎在第一次加載時,bean方法不會被綁定到對象。

在使用FullAjaxExceptionHandler時,如何在錯誤頁面中添加一個命令按鈕,其中action/actionlistener被正確綁定到HTML組件?

+0

嗨,我看到你試圖通過編輯發表評論。這不是它在這裏工作的方式。添加評論應通過「添加評論」鏈接完成。 – BalusC

+0

@BalusC,謝謝你,我在這裏是一個新手。您能否詳細說明一下「請注意,這些腳本需要放在調用ajax操作的頁面上,而不是放在錯誤頁面上。」我的困境是,我想在錯誤頁面中添加一個按鈕,因此該操作是在錯誤頁面中調用的?提前致謝! – mutya

+0

導致異常的頁面。這些腳本應該在ajax異常處理期間執行。請注意,每個答案也有一個「添加評論」鏈接。 – BalusC

回答

2

這對我來說很有效,它是BalusC在他的回答中提到的方法的組合。它適用於IE和Firefox。它可能需要對某些情況進行一些調整,但由於我得到的錯誤頁面只有一種形式,所以我沒有費心去循環表格。

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); 
    } 
}; 
+0

viewState的隱藏輸入也需要正確的ID。沒有它的Ajax請求將無法正常工作。 'hidden.setAttribute(「id」,「javax.faces.ViewState」);' – blevert

0

這個問題有兩個可能的原因:

  1. 如果您正在使用Internet Explorer,那麼這個被識別爲PrimeFaces @all失敗初始化基於IE瀏覽器的AJAX所需的JavaScript。這裏回答這個問題:Object doesn't support this property or method with primefaces omnifaces timeout combination

  2. 如果您正在使用其他瀏覽器,你使用JSF標準<f:ajax>以觸發Ajax動作,那麼這是識別爲JSF自己jsf.js失敗的@all後更新各種形式的JSF視圖狀態。這裏回答了這個問題:Bug report form on error page

請注意,這些腳本需要放在調用ajax操作的頁面上,而不是放在錯誤頁面本身上。

+0

上述解決方案的組合爲我工作。感謝您耐心試圖瞭解正在發生的事情。我用IE和FF測試了它,這種方法奏效了,我將把它放在一個單獨的答案中,因爲評論不會讓我有很長的一段時間......抱歉,這是新的。 – mutya

相關問題