【问题标题】:Dynamic <ui:include src> depending on <ui:repeat var> doesn't include anything取决于 <ui:repeat var> 的动态 <ui:include src> 不包含任何内容
【发布时间】:2013-02-16 23:52:11
【问题描述】:

我是 JSF 的新手,我正在努力动态渲染包含的页面。我的代码如下所示:

菜单豆

@ViewScoped
public class MenuBean implements Serializable {

    private MenuItem[] menuItems = new MenuItem[] {
        new MenuItem("page_1", "/page_1.xhtml"),
        new MenuItem("page_2", "/page_2.xhtml"),
    };

    private String selectedItemLabel;

    //...
}

菜单项

public class MenuItem implements Serializable {

    private String label;
    private String page;

    //...
}

index.xhtml

    <ui:repeat var="menuItem" value="#{menuBean.menuItems}">                                    
        <h:panelGroup rendered="#{menuBean.selectedItemLabel eq menuItem.label}" layout="block">
            <h:outputText value="#{menuBean.selectedItemLabel}" />                              
            <ui:include src="#{menuItem.page}" />                                           
        </h:panelGroup>                                                                     
    </ui:repeat>                                                                            

结果是渲染了 2 个按钮。每当我单击任何按钮时,会出现有条件渲染的 panelGroup 内的标签,但包含的页面不会出现。如果我从第一个 ui:repeat 更改 'menuItem1' var,它会起作用,但它确实是不可预测的。例如,如果我将 setSelectedItemLabel 参数硬编码为“page_1”,那么当我点击 button_1 时会显示 page_1,但即使我点击 button_2 page_2 (!?) 也会显示...

【问题讨论】:

    标签: jsf dynamic jsf-2 uirepeat uiinclude


    【解决方案1】:

    您面临视图构建时间与视图渲染时间的问题。这基本上与JSTL in JSF2 Facelets... makes sense? 中已详细回答的问题相同。在该答案中,将“JSTL”替换为“ui:include”。至此,&lt;ui:repeat&gt; 在视图渲染期间运行,而 &lt;ui:include&gt; 之前已经在视图构建期间运行。

    您会明白,唯一的解决方案是将 &lt;ui:repeat&gt; 替换为在视图构建期间运行的另一个标签,例如 JSTL &lt;c:forEach&gt;

    请注意,我不保证它会解决您想到的具体功能要求。使用 JSTL 可能会产生不良的“副作用”(不过这些副作用是可以解释、可以理解和可以解决的)。

    另见:

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2013-12-05
      • 1970-01-01
      • 2014-09-04
      • 2019-02-08
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 2021-12-12
      相关资源
      最近更新 更多