有条件地渲染<ui:include> </ui:include>

时间:2013-09-09 17:27:38

标签: jsf richfaces facelets jsf-1.2 uiinclude

我正在尝试切换显示<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>

支持bean:

private boolean showPolicyView = false;

public void showView() {
    showPolicyView = !showPolicyView;
}

public boolean isShowPolicyView(){
    return showPolicyView;
}

2 个答案:

答案 0 :(得分:20)

<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,如果可以的话。例如,如果您选择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>

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

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


介绍RichFaces

检查this link以获取有关在项目中设置RichFaces的帮助。

答案 1 :(得分:0)

与像这样插入h:panelBoxes相比,我更喜欢使用标记处理程序:

<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>

优点:标记处理程序不代表组件,并且一旦建立视图,就永远不会成为组件树的一部分。它不会与CSS完全兼容-相反,h:panelBox会插入div或span。

摆弄标签处理程序(如任何c:xxx)时,请务必知道difference between UI Components and Tag Handlers。即,UI组件和标记处理程序在不同阶段进行渲染。这意味着您不能在复合组件中创建变量,也不能在嵌套标签处理程序中使用它。 c:chooseui:include都是标记处理程序,因此通常这不是问题。阅读链接,这是一个非常简短的示例,而且很有见地。