如何使一个 SelectManyMenu 依赖于 JSF 中的另一个?
How to make one SelectManyMenu depends on other in JSF?
我在 PrimeFaces 中有两个 selectManyMenu:
<p:selectManyMenu id="vehicleMakes"
value="#{analyticsController.selectedVehiclesMake}"
filter="true"
filterMatchMode="startsWith"
multiple="true"
scrollHeight="250"
showCheckbox="true"
styleClass="customInput manymenu-advanced"
label="#{msg['ANALYTICS-vehicle-brand-select']}">
<f:selectItems var="make" itemLabel="#{make}"
value="#{analyticsController.vehicleMakeList}"
itemValue="#{make}"
/>
<p:ajax event="change" listener="#{analyticsController.restoreFilters()}">
</p:ajax>
</p:selectManyMenu>
另一个:
<p:selectManyMenu id="vehicleModels"
value="#{analyticsController.selectedVehiclesModel}"
filter="true"
filterMatchMode="startsWith"
multiple="true"
scrollHeight="250"
onchange="familyComponents(this, 'gfVehicleModelList', 'selectManyMenu')"
showCheckbox="true"
styleClass="customInput manymenu-advanced gfVehicleModelList"
label="#{msg['ANALYTICS-vehicle-model-select']}">
<f:selectItems
var="model"
itemLabel="#{model}"
value="#{analyticsController.vehicleModelList}"
itemValue="#{model}"
/>
</p:selectManyMenu>
但是我需要当一个元素在 select 第一个中被 select 编辑时,根据 select 第二个中的 FK 加载内容,为此我创建了这个函数:
public void filterModelBySelectedMakes(){
if (!CollectionUtils.isEmpty(selectedVehiclesMake) && !CollectionUtils.isEmpty(makes)){
List<Integer> makeIds = makes.stream().filter(make -> selectedVehiclesMake.contains(make.getName())).map(Make::getId).sorted().collect(Collectors.toList());
vehicleModelList = models.stream().filter(model -> makeIds.contains(model.getMakeId())).map(Model::getName).filter(StringUtils::isNotBlank).sorted().collect(Collectors.toList());
}
}
直接使用已经加载好的List,不知道什么时候执行这个函数?或者如果有其他更简单的方法,你能帮我吗?
提前致谢
你想看这个例子:https://www.primefaces.org/showcase-v8/ui/ajax/dropdown.xhtml
正是您想要的,根据第一个组件中的选择更改第二个组件的内容。
我在 PrimeFaces 中有两个 selectManyMenu:
<p:selectManyMenu id="vehicleMakes"
value="#{analyticsController.selectedVehiclesMake}"
filter="true"
filterMatchMode="startsWith"
multiple="true"
scrollHeight="250"
showCheckbox="true"
styleClass="customInput manymenu-advanced"
label="#{msg['ANALYTICS-vehicle-brand-select']}">
<f:selectItems var="make" itemLabel="#{make}"
value="#{analyticsController.vehicleMakeList}"
itemValue="#{make}"
/>
<p:ajax event="change" listener="#{analyticsController.restoreFilters()}">
</p:ajax>
</p:selectManyMenu>
另一个:
<p:selectManyMenu id="vehicleModels"
value="#{analyticsController.selectedVehiclesModel}"
filter="true"
filterMatchMode="startsWith"
multiple="true"
scrollHeight="250"
onchange="familyComponents(this, 'gfVehicleModelList', 'selectManyMenu')"
showCheckbox="true"
styleClass="customInput manymenu-advanced gfVehicleModelList"
label="#{msg['ANALYTICS-vehicle-model-select']}">
<f:selectItems
var="model"
itemLabel="#{model}"
value="#{analyticsController.vehicleModelList}"
itemValue="#{model}"
/>
</p:selectManyMenu>
但是我需要当一个元素在 select 第一个中被 select 编辑时,根据 select 第二个中的 FK 加载内容,为此我创建了这个函数:
public void filterModelBySelectedMakes(){
if (!CollectionUtils.isEmpty(selectedVehiclesMake) && !CollectionUtils.isEmpty(makes)){
List<Integer> makeIds = makes.stream().filter(make -> selectedVehiclesMake.contains(make.getName())).map(Make::getId).sorted().collect(Collectors.toList());
vehicleModelList = models.stream().filter(model -> makeIds.contains(model.getMakeId())).map(Model::getName).filter(StringUtils::isNotBlank).sorted().collect(Collectors.toList());
}
}
直接使用已经加载好的List,不知道什么时候执行这个函数?或者如果有其他更简单的方法,你能帮我吗?
提前致谢
你想看这个例子:https://www.primefaces.org/showcase-v8/ui/ajax/dropdown.xhtml
正是您想要的,根据第一个组件中的选择更改第二个组件的内容。