我想根据以前的 <f:selectItems>
的选定值在 <ui:repeat>
中显示多个 <p:selectOneMenu>
组件,直到到达树的叶子。
例如。<p:selectOneMenu>
中的第一个国家/地区。现在我选择一个国家说巴基斯坦。现在,在<ui:repeat>
中,将有第二个<p:selectOneMenu>
组件,其中包括巴基斯坦城市。现在,我选择一个城市,然后应该有第三个<p:selectOneMenu>
带有城市扇区,依此类推,直到从数据库中找不到记录。
我该如何实现?
<ui:repeat>
对此非常有用。首先,DB中没有无限数量的表。只需根据DB表中的可用选择项目有条件地渲染后代下拉列表。
<p:selectOneMenu value="#{bean.country}">
<f:selectItem itemValue="#{null}" itemLabel="--select country--" />
<f:selectItems value="#{bean.countries}" />
<p:ajax listener="#{bean.changeCountry}" update="cities" />
</p:selectOneMenu>
<h:panelGroup id="cities">
<p:selectOneMenu value="#{bean.city}" rendered="#{not empty bean.cities}">
<f:selectItem itemValue="#{null}" itemLabel="--select city--" />
<f:selectItems value="#{bean.cities}" />
<p:ajax listener="#{bean.changeCity}" update="sectors" />
</p:selectOneMenu>
</h:panelGroup>
<h:panelGroup id="sectors">
<p:selectOneMenu value="#{bean.sector}" rendered="#{not empty bean.sectors}">
<f:selectItem itemValue="#{null}" itemLabel="--select sector--" />
<f:selectItems value="#{bean.sectors}" />
</p:selectOneMenu>
</h:panelGroup>
在 @ViewScoped
bean中使用这样的东西:
private List<String> countries;
private String country;
private List<String> cities;
private String city;
private List<String> sectors;
private String sector;
@EJB
private LocationService locationService;
@PostConstruct
public void init() {
countries = locationService.getCountries();
}
public void changeCountry() {
cities = locationService.getCities(country);
city = null;
sectors = null;
}
public void changeCity() {
sectors = locationService.getSectors(city);
sector = null;
}
当然,您还可以使用Country
,也可以使用CC_11,City
和Sector
实体以及(通用)转换器。
另请参见:
- 如何从数据库中填充h:selectonemenu的选项?
- 我们的
selectOneMenu
Wiki Page