有条件地渲染<ui:include>

Gil*_*t V 12 jsf richfaces facelets jsf-1.2 uiinclude

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

<ui:include src="../log/viewDlg.xhtml"/>
Run Code Online (Sandbox Code Playgroud)

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


更新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>
Run Code Online (Sandbox Code Playgroud)

支持豆:

private boolean showPolicyView = false;

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

public boolean isShowPolicyView(){
    return showPolicyView;
}
Run Code Online (Sandbox Code Playgroud)

Fri*_*itz 21

包裹你的<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>
Run Code Online (Sandbox Code Playgroud)

yourBean#renderTable是一个Boolean属性,用于确定是否将呈现该组件.当它评估为时false,组件不包含在组件树中.


切换视图

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

<h:commandLink action="#{yourBean.toggleTableView}"/>
Run Code Online (Sandbox Code Playgroud)

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

<a4j:commandLink action="#{yourBean.toggleTableView}" reRender="wrapperPannel"/>
Run Code Online (Sandbox Code Playgroud)

或者,另一种选择是

<a4j:commandLink action="#{yourBean.toggleTableView}">
    <a4j:support event="oncomplete" reRender="wrapperPannel"/>
</a4j:commandLink>
Run Code Online (Sandbox Code Playgroud)

请注意,该reRender属性可能会因页面结构而异,但应始终引用包装面板的ID.此外,reRender还改名为renderRichFaces后期版本.

因此,假设您有一个renderTable属性(getter + setter)yourBean,toggleTableView必须更改它,以便以动态方式定义是否要呈现组件(renderTable = false).


介绍RichFaces

查看此链接以获取有关在项目中设置RichFaces的帮助.


Han*_*yer 5

我喜欢使用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>
Run Code Online (Sandbox Code Playgroud)

优点:标签处理程序不代表组件,并且一旦构建了视图就永远不会成为组件树的一部分。它不会干扰您的 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>
Run Code Online (Sandbox Code Playgroud)

注意:在使用标签处理程序(如 any c:xxx)时,一定要知道UI Components 和 Tag Handlers 之间区别。即 UI 组件和标签处理程序在不同阶段呈现。这意味着您不能在复合组件中创建变量并在嵌套标记处理程序中使用它。c:choose并且ui:include都是标签处理程序,所以通常这不是问题。阅读链接,这是一个非常简短的示例并且非常有见地。