我是JSF的新手,我希望您对如何实现我需要的最佳方式提出建议。另外在Stackoverflow中的第一篇文章,所以请原谅我是否不清楚任何事情。
我有一个P:TabView,带有动态数量的选项卡,以C:以下方式生成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:p:commandlink单击其中一个视图(,我想更改选项卡中显示的内容到另一个选项卡的另一个视图有;换句话说,我想更改带有ui的选项卡中加载的SRC视图:include。我试图在控制器中与此命令链接相关联的方法中返回所需的视图路径,但是正如预期的那样,它将其重定向到新页面,而不是将其加载到选项卡中。
。切换标签内容时,我想保留相同的控制器实例(我的控制器是示波器(,避免绑定。
我有两个选择。
首先是尝试与此类似的尝试(从PrimeFaces TabView不同的选项卡中获得的不同选项卡(,从我的" ATAB"中获取视图路径,而不是对它们进行硬编码,然后尝试更新TAB或TABVIEW上的整个TabView更改布尔值后,我的命令链接在控制器中的两个页面之间切换:
<ui:include
src="#{curSearch.closeable ? '/sections/search/searchInstanceTab.xhtml' : '/sections/search/firstSearchTab.xhtml'}">
</ui:include>
第二页将在每个选项卡中包含两个页面,但是只能使用控制器中的布尔值渲染。对我来说,这听起来比第一个选项要差得多(在我之前链接的问题中,它被认为是一个答案(。
预先感谢,请随时建议任何更轻松/更好的方法。
::: edit :::
最终选择在单独的XHTML文件中将每个选项卡放入(用C:foreach循环加载(和每个xhtml/tab中的所有可能的视图(也在单独的xhtmls中(,硬编码。非常流畅的解决方案效果很好,它可能允许每个选项卡中具有动态内容,其中另一个C:foreach循环以及背bean中包含XHTML名称和布尔值的bean中的列表(这是呈现的(有点疯狂(。
第一个选项,即构建时间条件的视图可能会导致问题。例如。您将无法依靠条件表达式中的f:param。
这听起来比第一个选项
对我来说要差得多
情况并不糟糕。创建一堆组件并不昂贵。
这不是黑白事物,但是我的一般建议是不要优化,除非您实际遇到性能问题和分析确认这是瓶颈(不太可能(。坚持使用rendered
的最简单路径。
对于Mojarra,您可以像这样配置记录:
<logger category="javax.enterprise.resource.webcontainer.jsf.timing">
<level name="DEBUG"/>
</logger>
然后,您将确切看到与逻辑和渲染(其他阶段(相比,构建视图的时间(还原视图JSF生命周期阶段(:
在 阶段的执行时间(包括任何phaselisteners( -> RESTORE_VIEW 1
...
19:47:57,198调试[定时](默认任务3( [定时] - [ 172ms ]:阶段执行时间(包括任何 phaselisteners( -> render_response 6