我正在尝试切换显示<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;
}
答案 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
)。
检查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:choose
和ui:include
都是标记处理程序,因此通常这不是问题。阅读链接,这是一个非常简短的示例,而且很有见地。