【问题标题】:Double p:selectOneMenu to feed one last p:selectOneMenu with p:ajax listener双 p:selectOneMenu 用 p:ajax 监听器提供最后一个 p:selectOneMenu
【发布时间】:2015-04-20 14:52:52
【问题描述】:

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

为此,我在前两个<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}&#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());
}

【问题讨论】:

  • 你为 bean 使用了哪个范围?第二个菜单也依赖于第一个吗?
  • 您好! @RequestScoped,不,第一个和第二个之间没有依赖关系。但是第 3 个是由第 1 个和第 2 个(依赖)构建的。
  • 作为 @RequestScoped,您正在为每个请求重建 bean(在发生 ajax 请求时设置默认值)。尝试使用@ViewScoped
  • 有效!谢谢,我想我曾经用@SessionScoped 尝试过这个......你可以发布答案。

标签: ajax jsf primefaces


【解决方案1】:

根据 cmets,您使用的是 @RequestScoped bean。 ajax 事件会导致一个新请求,因此它正在重建并因此失去其当前状态。解决方案是使用视图范围并利用 JSF 的有状态特性。

另请参阅

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 2014-12-26
    • 1970-01-01
    • 2012-05-06
    • 2012-02-09
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多