我是 JSF 的新手,我希望你能就如何以最好的方式实现我需要的东西提出建议。也是 StackOverflow 中的第一篇文章,所以如果我不清楚某些事情,请原谅。
我的 ap: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 使用动态选项卡的不同选项卡内容获得),从我的“aTab”获取视图路径而不是对它们进行硬编码,然后尝试在我的 commandLink 上更新选项卡或整个 tabView更改在控制器中的两个页面之间切换的布尔值:
<ui:include
src="#{curSearch.closeable ? '/sections/search/searchInstanceTab.xhtml' : '/sections/search/firstSearchTab.xhtml'}">
</ui:include>
第二个将在每个选项卡中包含两个页面,但使用控制器中的布尔值仅呈现一个页面。这对我来说听起来比第一个选项更糟糕(建议作为我之前链接的问题的答案)。
在此先感谢,请随时提出任何更简单/更好的方法。
::: 编辑 :::
最后确实选择将每个选项卡放在单独的 xhtml 文件中(使用 c:foreach 循环加载),并在每个 xhtml/tab 中包含所有可能的视图(也在单独的 xhtml 中)ui:include'd 带有渲染子句,硬编码。非常流畅的解决方案并且效果很好,这可能允许在每个选项卡中包含动态内容,其中包含另一个 c:foreach 循环以及支持 bean 中的对列表,其中包含用于渲染的 xhtml 名称和布尔值(那变得有点疯狂)。