JSF - tabView中动态的标签数量,带有动态标签内容

时间:2018-02-07 19:37:50

标签: jsf dynamic primefaces tabs uiinclude

我是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获得),从我的“aTab”获取视图路径而不是硬编码,然后在我的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 with with render子句,硬编码。 非常流畅的解决方案,效果很好,可能允许在每个选项卡中包含动态内容,其中包含另一个c:foreach循环,以及支持bean中包含xhtml名称和布尔值的对列表(用于渲染)变得有点疯狂。)

1 个答案:

答案 0 :(得分: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) - &gt;   RESTORE_VIEW 1
  ...
  19:47:57,198 DEBUG [计时](默认任务-3)   [时间] - [ 172ms ]:阶段的执行时间(包括任何   PhaseListeners) - &gt; RENDER_RESPONSE 6