双重p:selectOneMenu用p:ajax监听器输入最后一个p:selectOneMenu

时间:2015-04-20 14:52:53

标签: ajax jsf primefaces

我有3 <p:selectOneMenu>,其中两个在这里喂第三个。但是当我在一个组合框中选择时,该值会在另一个组合框中消失。

为此,我在两个<p:ajax>中使用了两个<p:selectonemenu>个组件。

<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}&#160;&#160;" 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}&#160;&#160;" 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());
}

1 个答案:

答案 0 :(得分:2)

根据评论,您使用的是@RequestScoped bean。 ajax事件会导致新的请求,因此它会被重建并因此失去其当前状态。解决方案是使用视图范围并利用JSF&#39;有状态的性质。

另见