双倍 p:selectOneMenu 用 p:ajax 监听器喂养最后一个 p:selectOneMenu
Double p:selectOneMenu to feed one last p:selectOneMenu with p:ajax listener
我有 3 个 <p:selectOneMenu>
,其中两个来喂第三个。但是当我在一个组合框中 select 时,值在另一个组合框中消失。
为此,我在前两个 <p:selectonemenu>
中使用了 2 个 <p:ajax>
组件。
<p:panel columns="4" cellpadding="5" id="panelAddColor" header="#{msg['configuration_assignment_modif_panelheader']}" style="width: 500px;">
<table>
<tr>
<td>
<h:outputLabel for="comboBox_listBump" value="#{msg['bumper']}" />
</td>
<td>
<p:selectOneMenu id="comboBox_listBump" value="#{assignmentModificationController.idTypeBumper}" effect="fade" style="width: 100px;" styleClass="greyBackMenu" panelStyleClass="greyBackPanel">
<p:ajax event="change" listener="#{assignmentModificationController.comboboxBumpersChange()}" update="machine,comboBox_listBump,tint" />
<f:selectItem itemLabel="#{msg['menu_production_NewTech']}" itemValue="" />
<f:selectItems value="#{assignmentModificationController.listBumper}" var="b" itemLabel="#{b.name}" itemValue="#{b.id}"/>
</p:selectOneMenu>
</td>
<td>
<p:message for="comboBox_listBump" />
</td>
</tr>
<tr>
<td>
<h:outputLabel for="tint" value="#{msg['configuration_safetystock_tint']}" />
</td>
<td>
<p:selectOneMenu id="tint" value="#{assignmentModificationController.idTint}" effect="fade" styleClass="greyBackMenu" panelStyleClass="greyBackPanel">
<p:ajax event="change" listener="#{assignmentModificationController.comboboxBumpersChangeTint()}" update="machine,comboBox_listBump,tint" />
<f:selectItem itemLabel="#{msg['menu_production_NewTech']}" itemValue="" />
<f:selectItems value="#{assignmentModificationController.listTypeTint}" var="p" itemLabel="#{p.name}  " itemValue="#{p.id}" />
</p:selectOneMenu>
</td>
</tr>
<tr>
<td>
<h:outputLabel for="machine" value="#{msg['menu_configuration_machines']}" />
</td>
<td>
<p:selectOneMenu id="machine" value="#{assignmentModificationController.idMachine}" effect="fade" >
<f:selectItem itemLabel="#{msg['menu_production_NewTech']}" itemValue="" />
<f:selectItems value="#{assignmentModificationController.listMachines}" var="p" itemLabel="#{p.name}  " itemValue="#{p.id}" />
</p:selectOneMenu>
</td>
<td>
<p:message for="machine" />
</td>
</tr>
</table>
<center>
<p:commandButton value="Créer" update="growl,panelAddColor" validateClient="true" style="font-size: 13px;" action="#{assignmentModificationController.addTintAssignment}" />
-
<p:commandButton value="Quitter" style="font-size: 13px;" action="TO_config_menu" />
</center>
</p:panel>
我在 bean 中的测试:
@PostConstruct
public void init() {
setListBumper(TypeBumpHome.getAll());
setListTint(TypeTintHome.getAll());
setListMachines(MachineHome.getAll());
List<TypeTint> allTypeTint = new ArrayList<TypeTint>();
allTypeTint = TypeTintHome.getAll();
for (TypeTint t : allTypeTint) {
colorList.put(t.getId(), t.getName());
}
setListTypeTint(TypeTintHome.getAll());
}
public void comboboxBumpersChange() {
System.out.println("BUMPER : " + getIdTypeBumper() + " " + getIdTint());
}
public void comboboxBumpersChangeTint() {
System.out.println("TINT : " + getIdTypeBumper() + " " + getIdTint());
}
根据评论,您使用的是 @RequestScoped
bean。 ajax 事件引发了一个新请求,因此它正在重建并因此失去其当前状态。解决方案是使用视图范围并利用 JSF 的状态特性。
另见
- Difference between View and Request scope in managed beans
- Request Scope vs View Scope
- How to choose the right bean scope?
我有 3 个 <p:selectOneMenu>
,其中两个来喂第三个。但是当我在一个组合框中 select 时,值在另一个组合框中消失。
为此,我在前两个 <p:selectonemenu>
中使用了 2 个 <p:ajax>
组件。
<p:panel columns="4" cellpadding="5" id="panelAddColor" header="#{msg['configuration_assignment_modif_panelheader']}" style="width: 500px;">
<table>
<tr>
<td>
<h:outputLabel for="comboBox_listBump" value="#{msg['bumper']}" />
</td>
<td>
<p:selectOneMenu id="comboBox_listBump" value="#{assignmentModificationController.idTypeBumper}" effect="fade" style="width: 100px;" styleClass="greyBackMenu" panelStyleClass="greyBackPanel">
<p:ajax event="change" listener="#{assignmentModificationController.comboboxBumpersChange()}" update="machine,comboBox_listBump,tint" />
<f:selectItem itemLabel="#{msg['menu_production_NewTech']}" itemValue="" />
<f:selectItems value="#{assignmentModificationController.listBumper}" var="b" itemLabel="#{b.name}" itemValue="#{b.id}"/>
</p:selectOneMenu>
</td>
<td>
<p:message for="comboBox_listBump" />
</td>
</tr>
<tr>
<td>
<h:outputLabel for="tint" value="#{msg['configuration_safetystock_tint']}" />
</td>
<td>
<p:selectOneMenu id="tint" value="#{assignmentModificationController.idTint}" effect="fade" styleClass="greyBackMenu" panelStyleClass="greyBackPanel">
<p:ajax event="change" listener="#{assignmentModificationController.comboboxBumpersChangeTint()}" update="machine,comboBox_listBump,tint" />
<f:selectItem itemLabel="#{msg['menu_production_NewTech']}" itemValue="" />
<f:selectItems value="#{assignmentModificationController.listTypeTint}" var="p" itemLabel="#{p.name}  " itemValue="#{p.id}" />
</p:selectOneMenu>
</td>
</tr>
<tr>
<td>
<h:outputLabel for="machine" value="#{msg['menu_configuration_machines']}" />
</td>
<td>
<p:selectOneMenu id="machine" value="#{assignmentModificationController.idMachine}" effect="fade" >
<f:selectItem itemLabel="#{msg['menu_production_NewTech']}" itemValue="" />
<f:selectItems value="#{assignmentModificationController.listMachines}" var="p" itemLabel="#{p.name}  " itemValue="#{p.id}" />
</p:selectOneMenu>
</td>
<td>
<p:message for="machine" />
</td>
</tr>
</table>
<center>
<p:commandButton value="Créer" update="growl,panelAddColor" validateClient="true" style="font-size: 13px;" action="#{assignmentModificationController.addTintAssignment}" />
-
<p:commandButton value="Quitter" style="font-size: 13px;" action="TO_config_menu" />
</center>
</p:panel>
我在 bean 中的测试:
@PostConstruct
public void init() {
setListBumper(TypeBumpHome.getAll());
setListTint(TypeTintHome.getAll());
setListMachines(MachineHome.getAll());
List<TypeTint> allTypeTint = new ArrayList<TypeTint>();
allTypeTint = TypeTintHome.getAll();
for (TypeTint t : allTypeTint) {
colorList.put(t.getId(), t.getName());
}
setListTypeTint(TypeTintHome.getAll());
}
public void comboboxBumpersChange() {
System.out.println("BUMPER : " + getIdTypeBumper() + " " + getIdTint());
}
public void comboboxBumpersChangeTint() {
System.out.println("TINT : " + getIdTypeBumper() + " " + getIdTint());
}
根据评论,您使用的是 @RequestScoped
bean。 ajax 事件引发了一个新请求,因此它正在重建并因此失去其当前状态。解决方案是使用视图范围并利用 JSF 的状态特性。
另见
- Difference between View and Request scope in managed beans
- Request Scope vs View Scope
- How to choose the right bean scope?