16

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

2 回答 2

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>

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。此外,在 RichFaces 后期版本reRender中更名为简单render

所以,假设你有一个renderTable属性(getter + setter)yourBeantoggleTableView必须改变它,以便动态地定义组件是否被渲染(renderTable = false)。


介绍 RichFaces

检查此链接以获得在您的项目中设置 RichFaces 的帮助。

于 2013-09-09T17:59:49.957 回答
5

我喜欢使用ui:includeh: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>

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

于 2018-12-17T16:35:47.793 回答