一尘不染

JSF语言切换器和Ajax更新

ajax

这个问题是JSF 2中较早的Languageswitcher实现的后续。

尽管PrimeFaces发布了一些较新的版本,但该问题的实质仍然有效,而我的JSF知识比以前更好了。

总而言之,我只有一个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 显示标志,反之亦然。我希望使用Resource Bundle翻译来更新网页中的所有内容。

特别是,我有一些p:dialogS,其标头属性也需要更新。对话框窗体位于每个对话框中:

<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


阅读 229

收藏
2020-07-26

共1个答案

一尘不染

update="@all"所有PrimeFaces版本到现在为止(3.4.2)已知在IE失败。与ajax响应一起交付的所有JavaScript代码均未正确初始化。

PrimeFaces论坛主题对此进行了讨论,并报告为问题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);
    }
};

提供这种样式的JS文件,以强制正确的加载顺序在JS文件<h:outputScript target="head">内部进行<h:body>加载。

<h:body>
    <h:outputScript name="script.js" target="head" />
    ...
</h:body>
2020-07-26