2012-11-25 18 views
3

這個問題是舊Language switcher implementation in JSF 2的後續行動。JSF語言切換器和阿賈克斯更新

雖然PrimeFaces已經發布了一些更新的版本,但問題的實質仍然有效,而且我的JSF知識比以前好了一些。總結一下,我有一個單獨的xhtml頁面,完全ajaxified。

語言切換器是這樣的:

<h:form id="selectLanguage" > 
    <p:commandLink action="#{languageSwitcher.setLanguage('it')}" rendered="#{languageSwitcher.language!='it'}" > 
     <h:graphicImage library ="images" name="it.gif" title="it" /> 
    </p:commandLink> 
    <p:commandLink action="#{languageSwitcher.setLanguage('en')}" rendered="#{languageSwitcher.language!='en'}" > 
     <h:graphicImage library ="images" name="en.gif" title="en" /> 
    </p:commandLink> 
</h:form> 

我想,當選擇it,只顯示en標誌,反之亦然。我希望網頁中的所有內容都用資源包翻譯進行更新。

特別是,我有一些p:dialog S的頭標屬性也需要更新。 對話框形式是每個對話框內:

<p:dialog header="#{msgs.myHeader}" ... > 
    <h:form .... /> 
</p:dialog > 

在網頁的其餘部分是含有一些layoutUnits一個<p:layout>。每個layoutUnit都包含一個表單,其中還需要翻譯其他組件。

LanguageSwitcher是SessionScopedJSF Managed Bean

我已經嘗試了所有的方法如下:

  1. <f:ajax render="@all" />p:commandLink括號內
  2. update="@all"屬性中p:commandLink
  3. <p:ajax update="@all" />p:commandLink括號

可惜裏面,他們沒有作品。

我試過用@all,雖然我可以插入表單的ID,但它們並不多。問題在於對話頭不以這種方式更新。

我使用PrimeFaces 3.4.1 - 鑽嘴魚科2.1.13

+1

還沒有讀完整個問題,但簡單的' Daniel

+1

您使用了哪種瀏覽器? PrimeFaces的'@ all'在IE中失敗,無法後處理檢索到的JavaScript(修復程序爲3.4.2)。 ''在''中不起作用,用''代替。 – BalusC

+0

感謝您的寶貴意見。 @丹尼爾:我確實需要阿賈克斯。 – perissf

回答

1

update="@all"所有PrimeFaces版本到現在爲止(3.4.2)已知在IE失敗。與ajax響應一起發送的任何JavaScript代碼都未正確初始化。

這在this PrimeFaces forum topic中討論並報告爲issue 4731

直到他們解決這個問題,最好的辦法是通過加載每查看下面的一段JavaScript這(可能)包含一個update="@all"命令要解決它:

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

    if (newViewRoot) { 
     $('head').html(newViewRoot.substring(newViewRoot.indexOf("<head>") + 6, newViewRoot.indexOf("</head>"))); 
     $('body').html(newViewRoot.substring(newViewRoot.indexOf("<body>") + 6, newViewRoot.indexOf("</body>"))); 
    } else { 
     originalPrimeFacesAjaxResponseFunction.apply(this, arguments); 
    } 
}; 

在JS文件的香味提供這在<h:body>內加載<h:outputScript target="head">以強制執行正確的加載順序。

<h:body> 
    <h:outputScript name="script.js" target="head" /> 
    ... 
</h:body>