首页 文章

JSF - tabView中动态的选项卡数量,带有动态选项卡内容

提问于
浏览
0

我是JSF的新手,我想了解如何以最佳方式实现我需要的建议 . 也是StackOverflow的第一篇文章,所以如果我不清楚某些事情,请原谅 .

我有一个带有动态数量的选项卡的p:tabView,使用c:foreach以下面的方式生成,带有视图范围的辅助bean .

<p:tabView id="tabViewId">
    <c:forEach items="#{controller.list}" var="aTab">
          <p:tab title="#{aTab.label}">
              <ui:include src="#{aTab.firstUrl}"/>
          </p:tab>
    </c:forEach>
</p:tabView>

这很有效,我很满意 . 现在问题是我的每个选项卡都有两个可能的视图,当某个事件被触发时(在其中一个视图中单击了ap:commandLink)我想将选项卡中显示的内容更改为该选项卡的另一个视图具有;换句话说,我想用ui:include更改选项卡内加载的src视图 . 我试图在控制器中与此commandLink关联的方法中返回我想要的视图路径,但正如预期的那样,它会重定向到新页面而不是将其加载到选项卡中 .

我想在切换选项卡内容(我的控制器是视图范围)时保持相同的控制器实例,并避免绑定 .

我有两种选择 .

首先尝试类似于此的东西(从primefaces tabView different tab content with dynamic tabs获取),从我的_2595699获取视图路径而不是硬编码,然后在更改在两个页面之间切换的布尔值后尝试更新我的commandLink上的选项卡或整个tabView在控制器中:

<ui:include
    src="#{curSearch.closeable ? '/sections/search/searchInstanceTab.xhtml' : '/sections/search/firstSearchTab.xhtml'}">
</ui:include>

第二个是在每个选项卡中包含两个页面,但只使用控制器中的布尔值来渲染一个页面 . 这听起来比第一个选项更糟糕(它在我之前链接的问题中被建议作为答案) .

在此先感谢,请随时建议更轻松/更好的方式 .

:::编辑:::

最后确实选择将每个选项卡放在一个单独的xhtml文件中(加载c:foreach循环),并在每个xhtml / tab中包含所有可能的视图(也在单独的xhtmls中)ui:include'd with rendered子,硬编码 . 非常流畅的解决方案,效果很好,可能允许在每个选项卡中包含动态内容,其中包含另一个c:foreach循环,以及支持bean中包含xhtml名称和布尔值的对列表(用于渲染)变得有点疯狂) .

1 回答

  • 0

    第一个选项,即视图构建时间条件,在某些情况下可能会导致问题 . 例如 . 你将无法在条件表达式中依赖f:param .

    这听起来比第一个选项更糟糕

    这并没有太糟糕 . 创建一堆组件并不是那么昂贵 .

    这不是一个黑白分明的事情,但我的一般建议是不进行优化,除非你确实遇到性能问题并且分析确认这是瓶颈(不太可能) . 坚持最简单的路径,即使用 rendered .

    对于Mojarra,您可以像这样配置日志记录:

    <logger category="javax.enterprise.resource.webcontainer.jsf.timing">
        <level name="DEBUG"/>
    </logger>
    

    然后,您将看到构建视图的确切时间(还原视图JSF生命周期阶段)与逻辑和渲染(其他阶段)相比:

    19:47:57,026 DEBUG [timing](默认任务-3)[TIMING] - [7ms]:阶段的执行时间(包括任何PhaseListeners) - > RESTORE_VIEW 1 ... 19:47:57,198 DEBUG [timing](默认任务-3)[时间] - [172ms]:阶段的执行时间(包括任何PhaseListeners) - > RENDER_RESPONSE 6

相关问题