1

在使用返回 null 的操作中更改语言环境后,我道歉页面应该重新加载,但在第一次单击更改语言环境的链接后,带有日期的字段不会改变。我使用 MyFaces

我有一个页面,用户可以在其中设置语言环境,并且在更改语言环境后,我无法在第二次推送更改语言环境的链接后获得所需的日期格式。我从这篇文章中使用 bean 进行本地化

本地化文章

我不明白为什么在

<h:outputText value="#{newsVar.date}">
<f:convertDateTime pattern="#{msg['date.pattern']}" />
</h:outputText>

!!!!已编辑!!! 当我在 mainLayout.xhtml 中使用构面时,我在获取 dataField 的 id 时遇到了一些问题

<f:view locale="#{localeManager.language}">

            <div id="wrapper">
                <div class="header">
                    <ui:insert name="header">
                        <ui:include src="/pages/template/commonHeader.xhtml" />
                    </ui:insert>
                </div>
                <div class="content_container">
                    <ui:insert name="content" />
                </div>
            </div> 
</f:view>

commonHeader 包含在 commandLink

    <ui:composition>
        <h:form>
            <h1>
                <h:outputText value="#{msg['header.text']}" />
            </h1>
            <div class="lang_selector">             
                <h:commandLink action="#{localeManager.changeLanguage('ru')}"
                    value="#{msg['header.language.ru']}">
<!--                    <f:ajax render=":listGroupId:dateField" />-->
                </h:commandLink>
                <h:commandLink action="#{localeManager.changeLanguage('en')}"
                    value="#{msg['header.language.en']}">
<!--                    <f:ajax render=":listGroupId:dateField" />-->
                </h:commandLink>
            </div>
        </h:form>
    </ui:composition>

在当前页面中,我有下一个

<ui:composition template="/pages/layouts/mainLayout.xhtml">
        <ui:define name="content">
            <f:event type="preRenderView" listener="#{news.showNews}" />
            <h:form id="listForm" prependId="false">
                        <h:panelGroup id="listGroupId">             
                <ui:repeat var="newsVar" value="#{news.newsList}">
                    <div class="news_item">
                        <div class="news_title">
                            <h1>
                                <h:outputText value="#{newsVar.title}" />
                            </h1>
                            <div class="news_date">
                                <h:outputText id="dateField" value="#{newsVar.date}">
                                    <f:convertDateTime pattern="#{msg['date.pattern']}" />
                                </h:outputText>
                            </div>

如您所见,尝试获取“dateField”的 id,但该 id 的形式不同。我阅读了下一篇文章How to JSF 2.0: – 在表单之外渲染组件我知道我应该设置<h:form id="listForm" prependId="false">然后我可以在没有表单名称的情况下设置 elementId<f:ajax/>但我得到错误javax.faces.FacesException - Component with id::listGroupId:dateField not found

我发现:在渲染中指定的元素必须已经存在于客户端 HTML DOM 树中。可能这就是为什么我有这个问题

请帮帮我...为什么日期模式仅从第二次更改?

4

1 回答 1

1

我会推荐以下

1)通常更改setLanguagechangedLanguage(在该方法中设置语言属性),在动作属性中使用setter是一种不好的做法,并且通常在动作方法中使用get/set前缀

2)添加f:ajax

<h:commandLink action="#{localeManager.changedLanguage('en')}" value="#msg['header.language.en']}">
    <f:ajax render="dateField"/>
</h:commandLink>

3)h:outputText变成

<h:outputText id="dateField" value="#{newsVar.date}">
    <f:convertDateTime pattern="#{msg['date.pattern']}" />
</h:outputText>
于 2012-10-15T14:19:11.627 回答