代码之家  ›  专栏  ›  技术社区  ›  Gilbert V

有条件地呈现<ui:include>

  •  18
  • Gilbert V  · 技术社区  · 11 年前

    我正在尝试切换显示 <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;
    }
    
    2 回复  |  直到 11 年前
        1
  •  21
  •   Fritz    11 年前

    包裹你的 <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 属性,用于确定是否将渲染组件。当其评估为 虚假的 ,组件不包括在组件树中。


    切换视图

    要切换视图,只需创建一个bean方法即可刷新页面

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

    或通过AJAX的特定面板。要在JSF 1.2中做到这一点,如果可以的话,可以依靠像RichFaces这样的扩展来引入AJAX。例如,如果您选择RichFaces,您可以使用 <a4j:commandLink/> 而且它很方便 render (或 reRender 在旧版本中)属性,以实现使用 <f:ajax/> 在JSF 2中

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

    或者,另一种选择是

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

    请注意 重新渲染 属性可能会根据页面的结构而有所不同,但它最终应该始终引用包装面板的id。而且 重新渲染 已重命名为 提供 在最新的RichFaces版本中。

    所以,假设你有 renderTable 中的属性(getter+setter) yourBean 这个 toggleTableView 必须更改它,以便按常规定义是否要渲染组件( renderTable = false ).


    RichFaces简介

    检查 this link 寻求在您的项目中设置RichFaces的帮助。

        2
  •  5
  •   Hannes Schneidermayer    3 年前

    我喜欢使用 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:choot,它可以工作,但可能会导致渲染阶段问题。

    <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 ),一定要知道 difference between UI Components and Tag Handlers 也就是说,UI组件和标记处理程序在不同阶段进行渲染。这意味着您不能在复合组件中创建变量并在嵌套的标记处理程序中使用它。 c:choose ui:包括 都是标记处理程序,所以通常情况下这不是问题。阅读链接,这是一个非常简短的例子,非常有见地。