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

Posted

技术标签:

【中文标题】JSF - tabView 中的动态选项卡数量,具有动态选项卡内容【英文标题】:JSF - Dynamic amount of tabs in tabView, with dynamic tab contents 【发布时间】:2018-07-18 05:21:47 【问题描述】:

我是 JSF 的新手,我希望您能就如何以最佳方式实现我需要的东西提出建议。也是 *** 中的第一篇文章,所以如果我有不清楚的地方请见谅。

我有一个带有动态选项卡数量的 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”获取视图路径而不是对其进行硬编码,然后在更改命令链接后尝试更新选项卡或整个 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 带有渲染子句,硬编码。 非常流畅的解决方案并且效果很好,这可能允许在每个选项卡中包含动态内容,其中包含另一个 c:foreach 循环以及支持 bean 中包含 xhtml 名称和用于渲染的布尔值的对列表(那变得有点疯狂)。

【问题讨论】:

两者都可以。没有好坏之分。您可以根据页面的复杂程度做出选择 【参考方案1】:

第一个选项,即视图构建时间条件选项,在某些情况下可能会导致问题。例如。您将无法在条件表达式中依赖 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 调试 [计时](默认任务 3) [TIMING] - [172ms] :阶段的执行时间(包括任何 PhaseListeners) -> RENDER_RESPONSE 6

【讨论】:

谢谢,记录器也有用,这是我第一次听说。

以上是关于JSF - tabView 中的动态选项卡数量,具有动态选项卡内容的主要内容,如果未能解决你的问题,请参考以下文章

p:tabView:直接链接到选项卡

动态 TabView primefaces,选项卡渲染属性不起作用

Primefaces tabview 验证与动态选项卡

如何在 p:tabView 组件中动态添加和删除选项卡

Primefaces tabview 设置默认静态选项卡

QML TabView动态添加tab和赋初值