Richfaces 4 select仅在站点刷新后才能正确呈现

时间:2013-10-28 11:43:58

标签: ajax jsf select richfaces page-refresh

我不知道我做错了什么,或者它可能是一个错误或什么的。

我的设置包含IntelliJ IDEA 12,JBoss AS 7.2.0.Final,Richfaces 4.3.4 in war-File in ear-Project(no Maven)。

我有这个索引页面:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:a4j="http://richfaces.org/a4j" xmlns:rich="http://richfaces.org/rich">
    <rich:notifyMessage stayTime="3500" showShadow="true" showCloseButton="true" />
    <f:view>
        <h:head>    <title>     title   </title>    </h:head>
        <h:body>
            <!-- some more divs for page-design, but commented out at the moment -->
            <div id="page">
                <div id="index_workspace" style="width:1000px;margin:auto;">
                    <h:panelGrid columns="2" id="index_workspace_table">
                        <rich:panel id="index_workspace_navi_left" style="width:180px;min-height:600px;max-height:600px;">
                            <ui:include src="general/navi_left.xhtml"/>
                        </rich:panel>
                        <rich:panel id="index_workspace_content" style="width:550px; min-height:600px; max-height:600px;" rendered="#{not empty naviBean.content}">
                            <a4j:outputPanel id="index_workspace_content_ajax" ajaxRendered="true">
                                    <ui:include src="#{naviBean.content}" id="current_site" />
                            </a4j:outputPanel>
                        </rich:panel>
                    </h:panelGrid>
                </div>
            <!-- some more divs for page-design, but commented out at the moment -->
            </div>
        </h:body>
    </f:view>
</ui:composition>

在该部分中,我使用表格和RF带来的所有其他很酷的东西加载页面。但是我对加载页面的这一部分有渲染问题:

<rich:select id="someID_1" rendered="true" immediate="true" required="true" enableManualInput="true" defaultLabel="someLabel">
    <a4j:ajax render="true">
        <f:selectItems id="selectlist" value="#{BackingBean.SelectableItem-ListGetter}"/>
    </a4j:ajax>
</rich:select>

我的问题就在这里:

此下拉列表仅在页面重新加载时呈现,例如F5或CTRL-R动作。 另外我可以观察到,如果我将这个元素设置在某种“开始页面”(最初加载到index.xhtml)上,它会很好地呈现。在这种情况下,包含此类元素的每个其他页面也会正确呈现它。

我试过

  • 将JSF从2.1更新到2.2.1 - 这只会带来更多问题 - 所以我回滚了它。

  • “标准”h:selectOneMenu的行为相同。

  • rich中的其他选项:select(例如:render,immediate,required,...)

  • 导航中的不同ajax命令(服务器,客户端,ajax,不同级别)

  • 几天来搜索 - 发现没有可用的提示

我很感激每一条提示都会引导我走向正确的方向,因为我有信心,我犯了一些错误,我无法弄明白......

此外,我的导航看起来像这样(在index.xhtml的另一个div中):

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:a4j="http://richfaces.org/a4j" xmlns:rich="http://richfaces.org/rich">
    <h:form id="navi_left">
        <rich:panel>
            <rich:panelMenu itemMode="ajax" groupMode="ajax" itemChangeListener="#{naviBean.updateContent}" >
            <rich:panelMenuGroup itemLeftIcon="disc" label="Erfassung" name="#{naviBean.content}">
                <rich:panelMenuItem label="someLabel_navi" name="path/to/page-not-getting-rendered-well.xhtml"/>
            </rich:panelMenuGroup>
         </rich:panel>
    </h:form>
</ui:component>

希望这有助于我。

2 个答案:

答案 0 :(得分:0)

 <a4j:ajax render="true">
    <f:selectItems id="selectlist" value="#{BackingBean.SelectableItem-ListGetter}"/>
</a4j:ajax>

上述结构不合法(因为您已经看过自己)。其中的render属性并未用于您期望的内容:有条件地呈现组件;相反,它应该包含要通过ajax更新的页面组件列表。

为了达到我认为你想要获得的输出,你应该使用以下代码:

    <a4j:region>
       <rich:select id="someID_1" rendered="true" immediate="true" required="true" enableManualInput="true" defaultLabel="someLabel">
          <f:selectItems id="selectlist" value="#{BackingBean.SelectableItem-ListGetter}"/>
       </rich:select>
    <a4j:region>

答案 1 :(得分:0)

我想我发现了这个问题。由于我的导航和我想要的网站与未正确呈现的组件嵌套在第三个参与网站上的&lt; div&gt; s中 - 我的index.xhtml - 似乎不可能在没有全部的情况下渲染jsf组件(即在服务器上处理的导航和所需的站点。因此,以下代码片段适用于我的情况:

index.xhtml片段:

<rich:panel id="index_workspace_content" style="width:550px; min-height:600px; max-height:600px;" rendered="#{not empty naviBean.content}">
    <ui:include src="#{naviBean.content}" id="current_site" />
</rich:panel>

navi_left.xhtml片段:

<h:form id="navi_left">
    <rich:panel>
        <rich:panelMenu itemMode="server" groupMode="client" itemChangeListener="#{naviBean.updateContent}">
            <rich:panelMenuGroup label="someLabel" name="#{naviBean.content}">
                <rich:panelMenuItem label="anotherLabel" name="path/to/page-being-rendered-correctly.xhtml"/>
            </rich:panelMenuGroup>
...
</h:form>
所需的xhtml中的

组件片段:

<rich:select id="someId" rendered="true" immediate="true" required="true" enableManualInput="true">
    <f:selectItems var="#{backingBean.selectableItemList}" id="selectlist" value="#{backingBean.predefinedItem}"/>
</rich:select>

所以我改变的是 itemMode 到“服务器”,其他两个(ajax和客户端)都不起作用! 将groupMode设置为“client”不会影响desired.xhtml的渲染过程,因为它只描述了rich:panelMenu的行为方式。

让我感到有点困惑的是,现在用“/index.xhtml”扩展了URL。在更改之前,它始终只是url:port / context(例如localhost:8080 / app)。

所以它现在有效,但也许它不是我想要的。我将在此处观察并报告有关此 itemMode -option的未来事实。