PrimeFaces selectOneMenu 显示值未重置

问题描述

我有两个组合框。使用第一个的选定值检索第二个的项目。当第一个组合框选择认空值时,不会渲染第二个组合框。

除了一种情况外,一切都很好:

  1. 在第一个组合框中选择一个值 -> 出现第二个组合框
  2. 在第二个组合框中选择一个
  3. 在第一个组合框中选择认的空值 -> 第二个组合框消失
  4. 在第一个组合框中选择在步骤 1 中选择的相同值

第二个组合框应该显示为选择了空的认值,而是显示在步骤 2 中选择的值。

如果我在第 4 步选择不同的值,第二个组合框将正确加载,并选择认的空值。

视图:

<ui:composition template="/pages/include/templatePrincipal.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui" xmlns:d="http://iec.composants"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core">
    <ui:define name="pageActive">
        <f:view>
            <h:form>
                <p:panel id="panelModifierUnParametreFonctionnel"
                    header="LISTE DES FE FILLES ORPHELInes">

                    <h:panelGrid columns="6">
                        <p:outputLabel
                            value="#{feFillesOrphelinesBean.labelComboRegion}" />
                        <p:selectOneMenu 
                            value="#{feFillesOrphelinesBean.regionoption}" 
                            valuechangelistener="#{feFillesOrphelinesBean.regionChanged}"
                            onchange="submit()">
                            <f:selectItems value="#{feFillesOrphelinesBean.listRegion}" />
                        </p:selectOneMenu>
                        <p:outputLabel
                            value="#{feFillesOrphelinesBean.labelComboCorps}"
                            rendered="#{feFillesOrphelinesBean.rendreComboCorps}" />
                        <p:selectOneMenu 
                            value="#{feFillesOrphelinesBean.corpsOption}" 
                            rendered="#{feFillesOrphelinesBean.rendreComboCorps}"
                            valuechangelistener="#{feFillesOrphelinesBean.corpsChanged}"
                            onchange="submit()">
                            <f:selectItems value="#{feFillesOrphelinesBean.listCorps}" />
                        </p:selectOneMenu>
                    </h:panelGrid>

                </p:panel>
            </h:form>
        </f:view>
    </ui:define>
</ui:composition>

Java bean:

public class FEFillesOrphelinesBean implements Serializable {

    public final static String LABEL_COMBO_REGION = "Chaîne fonctionnelle :";
    public final static String LABEL_COMBO_CORPS = "Corps :";

    private String labelComboRegion;
    private String labelComboCorps;
    private List<SelectItem> listRegion;
    private Integer regionoption;
    private List<SelectItem> listCorps;
    private Integer corpsOption;
    private Boolean rendreComboCorps;

    public String init() {  
        this.chargerRegions();
        this.chargerCorps();

        this.setLabelComboRegion(LABEL_COMBO_REGION);
        this.setLabelComboCorps(LABEL_COMBO_CORPS);
        return "success";
    }
    
    public void chargerRegions() {      
        this.setListRegion(new ArrayList<>());
        this.setRegionoption(new Integer(-1));
        
        RegionAdmin[] tabRegions = ServiceFactory.getInstance().getGestionRegionSrv().findAll();
        
        this.getListRegion().add(new SelectItem(new Integer(-1)," "));
        for (RegionAdmin region : tabRegions) {
            SelectItem regionItem = new SelectItem(region.getId(),region.getLib() + ": " + region.getLibelle());
            this.getListRegion().add(regionItem);
        }
    }
    
    public void chargerCorps() {        
        this.setListCorps(new ArrayList<>());
        this.setCorpsOption(new Integer(-1));
        
        if (this.getRegionoption().equals(new Integer(-1))) {
            this.setRendreComboCorps(false);
        } else {
            Corps[] tabCorps = ServiceFactory.getInstance().getGestionCorpsSrv().findCorps(this.getRegionoption());
            
            this.getListCorps().add(new SelectItem(new Integer(-1)," "));
            for (Corps corps : tabCorps) {
                SelectItem corpsItem = new SelectItem(corps.getId(),corps.getLib() + ": " + corps.getLibelle());
                this.getListCorps().add(corpsItem);
            }
            
            this.setRendreComboCorps(true);
        }
    }
    
    public void regionChanged(ValueChangeEvent event) {
        Integer newRegionoption = (Integer) event.getNewValue();
        this.setRegionoption(newRegionoption);
        this.chargerCorps();
    }
    
    public void corpsChanged(ValueChangeEvent event) {
        Integer newCorpsOption = (Integer) event.getNewValue();
        this.setCorpsOption(newCorpsOption);
    }
    
    public String getLabelComboRegion() {
        return labelComboRegion;
    }

    public void setLabelComboRegion(String labelComboRegion) {
        this.labelComboRegion = labelComboRegion;
    }

    public String getLabelComboCorps() {
        return labelComboCorps;
    }

    public void setLabelComboCorps(String labelComboCorps) {
        this.labelComboCorps = labelComboCorps;
    }

    public List<SelectItem> getListRegion() {
        return listRegion;
    }

    public void setListRegion(List<SelectItem> listRegion) {
        this.listRegion = listRegion;
    }

    public Integer getRegionoption() {
        return regionoption;
    }

    public void setRegionoption(Integer regionoption) {
        this.regionoption = regionoption;
    }

    public List<SelectItem> getListCorps() {
        return listCorps;
    }

    public void setListCorps(List<SelectItem> listCorps) {
        this.listCorps = listCorps;
    }

    public Integer getCorpsOption() {
        return corpsOption;
    }

    public void setCorpsOption(Integer corpsOption) {
        this.corpsOption = corpsOption;
    }

    public Boolean getRendreComboCorps() {
        return rendreComboCorps;
    }

    public void setRendreComboCorps(Boolean rendreComboCorps) {
        this.rendreComboCorps = rendreComboCorps;
    }
}

如您所见,当第一个组合框的选定值发生变化时,会调用 regionChanged 方法,然后它会调用 ChargerCorps 方法,该方法将 corpsOption 设置为 -1 认值。这意味着在我描述的场景中,显示的选定值与 bean 中的选定值不同,这会导致很多问题。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)