3

この質問は、 JSF 2 での古い言語スイッチャーの実装のフォローアップです。

PrimeFaces はいくつかの新しいビルドをリリースしており、私の JSF の知識は以前より少し良くなっていますが、質問の内容はまだ有効です。

要約すると、完全に ajax 化された 1 つの xhtml ページがあります。

言語スイッチャーは次のとおりです。

<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フラグのみが表示され、その逆も同様です。また、Web ページ内のすべてのものをリソース バンドルの翻訳で更新したいと考えています。

特に、p:dialogヘッダー属性も更新する必要があるいくつかの S があります。ダイアログ フォームは各ダイアログ内にあります。

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

ページの残りの部分は、<p:layout>いくつかの layoutUnits を含む です。それぞれlayoutUnitには、同様に翻訳する必要がある他のコンポーネントを含むフォームが含まれています。

LanguageSwitcher はSessionScoped JSF 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 - Mojarra 2.1.13 を使用しています

4

1 に答える 1

1

現在までのupdate="@all"すべての PrimeFaces バージョン (3.4.2) は、IE で失敗することが知られています。ajax 応答とともに配信された JavaScript コードが正しく初期化されていません。

これは、この PrimeFaces フォーラム トピックで議論され、 issue 4731として報告されています。

update="@all"彼らが修正するまでは、(おそらく)コマンドを含むすべてのビューに次の JavaScript をロードして回避することをお勧めします。

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

正しい読み込み順序を強制するために、<h:outputScript target="head">内部で読み込まれる JS ファイルのフレーバーでこれを提供します。<h:body>

<h:body>
    <h:outputScript name="script.js" target="head" />
    ...
</h:body>
于 2012-11-26T20:33:03.483 に答える