的基本方法是让表的rendered
属性取决于菜单选择的项目。
<p:selectOneMenu value="#{bean.table}">
<f:selectItem itemValue="players" itemLabel="Players" />
<f:selectItem itemValue="jobs" itemLabel="Jobs" />
<f:selectItem itemValue="business" itemLabel="Business" />
...
<p:ajax update="tables" />
</p:selectOneMenu>
<h:panelGroup id="tables">
<p:dataTable value="#{bean.players}" rendered="#{bean.table == 'players'}">
...
</p:dataTable>
<p:dataTable value="#{bean.jobs}" rendered="#{bean.table == 'jobs'}">
...
</p:dataTable>
<p:dataTable value="#{bean.business}" rendered="#{bean.table == 'business'}">
...
</p:dataTable>
...
</h:panelGroup>
这很容易实现,但你最终在视图(这当然可以在<ui:include>
文件被分割)大量的代码。更高级和可重复使用的方法是让单个表的value
依赖于菜单的选定项并使用<p:columns>
动态生成列。
<p:selectOneMenu value="#{bean.table}">
<f:selectItems value="#{bean.tables}" />
<p:ajax listener="#{bean.changeModel}" update="table" />
</p:selectOneMenu>
<p:dataTable id="table" value="#{bean.model}" var="item">
<p:columns value="#{bean.columns}" var="column">
<h:outputText value="#{item[column]}" />
</p:columns>
</p:dataTable>
的东西,如:
public void changeModel() {
model = populateModelBasedOn(table);
columns = populateColumnsBasedOn(table);
}
这仅允许每当你想添加更多的专门列少细粒度控制。您可能想要使用标记文件。
什么是正确的数据表?条件呈现在jsf中是标准的。 – 2012-02-16 21:10:46
对不起。我是JSF的新手,那就是为什么不知道如何改变所选数据表的可见性。 – 2012-02-16 21:30:30
顺便说一下,我已更新我的问题 – 2012-02-16 22:01:12