有条件地呈现 <ui:include>



我正在尝试切换显示<rich:dataTable>的页面。在我只包含<ui:include>模板之前,它只会一直显示表格。

<ui:include src="../log/viewDlg.xhtml"/>

现在我希望能够在网页上打开/关闭它。在页面上显示按钮或链接。我怎样才能实现它?


更新1:由于某种奇怪的原因,我无法让它出现,这是我到目前为止根据反馈写的

视图:

<a4j:commandLink value="View"
    action="#{bean.showview}" render="viewPanel"/>
<h:panelGroup id="viewPanel">
    <h:panelGroup id="tableRenderPanel" rendered="#{bean.showPolicyView}">    
        <ui:include src="../log/viewDlg.xhtml"/>
    </h:panelGroup>                         
</h:panelGroup>

背豆:

private boolean showPolicyView = false;
public void showView() {
    showPolicyView = !showPolicyView;
}
public boolean isShowPolicyView(){
    return showPolicyView;
}

<ui:include>包装在两个<h:panelGroup>元素中。这里有一个问题,你不能重新渲染条件组件。这是为什么呢?因为当元素的 rendered 属性解析为 false 时,在呈现视图时不会考虑它,因此它不能成为操作的目标(在本例中,与呈现相关)。

跳转到代码,您将得到以下内容:

<h:panelGroup id="wrapperPanel">
    <h:panelGroup id="tableRenderPanel" rendered="#{yourBean.renderTable}">
        <ui:include src="../log/viewDlg.xhtml"/>
    </h:panelGroup>
</h:panelGroup>

yourBean#renderTable 是一个 Boolean 属性,用于确定是否将呈现组件。当它的计算结果为 false 时,组件不会包含在组件树中。


切换视图

要切换视图,只需创建一个刷新页面的 Bean 方法

<h:commandLink action="#{yourBean.toggleTableView}"/>

或通过 AJAX 的特定面板。要在 JSF 1.2 中执行此操作,如果可以的话,请依靠像 RichFaces 这样的扩展来引入 AJAX。例如,如果选择富面孔,则可以使用 <a4j:commandLink/> 及其方便的render(或旧版本中的reRender)属性来实现在 JSF 2 中使用<f:ajax/>通常可以执行的操作

<a4j:commandLink action="#{yourBean.toggleTableView}" reRender="wrapperPannel"/>

或者,另一种选择是

<a4j:commandLink action="#{yourBean.toggleTableView}">
    <a4j:support event="oncomplete" reRender="wrapperPannel"/>
</a4j:commandLink>

请注意,reRender 属性可能因页面结构而异,但它应始终在最后引用环绕面板的 ID。此外,reRender在后期的RichFaces版本中被重命名为简单的render

因此,假设您在yourBean中有一个renderTable属性(getter + setter),toggleTableView必须更改它,以便动态地定义组件是否要渲染(renderTable = false)。


富面孔简介

查看此链接以获取有关在项目中设置丰富面孔的帮助。

我喜欢使用ui:include比像这里这样插入h:panelBoxes更好:

<ui:fragment rendered="#{myBean.yourCondition()}">
    <ui:include src="viewA.xhtml"/>
</ui:fragment>
<ui:fragment rendered="#{not myBean.yourCondition()}">
    <ui:include src="viewB.xhtml"/>
</ui:fragment>

优点:标记处理程序不表示组件,并且在构建视图后永远不会成为组件树的一部分。它不会干扰您的 CSS - 相反,h:panelBox会插入div 或 span。

<小时 />

。另一种方法是 c:choose,它有效,但可能会导致渲染阶段问题。

<c:choose>
    <c:when test="#{myBean.yourCondition()}">
        <ui:include src="viewA.xhtml"/>
    </c:when>
    <c:otherwise>
        <ui:include src="viewB.xhtml"/>
    </c:otherwise>
</c:choose>

警告:摆弄标记处理程序(与任何c:xxx一样)时,请务必了解 UI 组件和标记处理程序之间的区别。即 UI 组件和标记处理程序在不同的阶段呈现结束。这意味着您不能在复合组件中创建变量并在嵌套标记处理程序中使用它。 c:chooseui:include 都是标记处理程序,因此通常这不是问题。阅读链接,这是一个非常简短的例子,非常有见地。

相关内容

  • 没有找到相关文章

最新更新