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

JSF - Dynamic amount of tabs in tabView, with dynamic tab contents

我是 JSF 的新手,我希望得到您关于如何以最佳方式实现我需要的建议。也是 Whosebug 中的第一个 post,所以如果我不清楚某些事情,请原谅我。

我有一个 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>

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

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

我有两个选择。

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

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

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

提前致谢,请随时提出任何 easier/better 方法。

::: 编辑 :::

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

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

This sounds much worse to me than the first option

并没有更糟。创建一堆组件并不昂贵。

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

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

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

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

19:47:57,026 DEBUG [timing] (default task-3) [TIMING] - [7ms] : Execution time for phase (including any PhaseListeners) -> RESTORE_VIEW 1
...
19:47:57,198 DEBUG [timing] (default task-3) [TIMING] - [172ms] : Execution time for phase (including any PhaseListeners) -> RENDER_RESPONSE 6