嵌套 <p:selectOneMenu 不更新值

nested <p:selectOneMenu does not update value

我有两个 selectOneMenu,一个更新另一个,但是第二个不更新它的值,并且仍然保留第一个值,尽管在任何代码中,这两个变量本身都是相等的。甚至 valueEventChangeListener returns 的 estados_eam 值。谢谢大家,任何帮助将不胜感激。最好的问候。

<h:outputText value="ESTADO:" />
                <p:selectOneMenu id="estados_eam" value="#{estadosMB.clave}"
                    style="width:200px;" required="true">
                    <f:selectItem itemLabel="Seleccione un estado" itemValue="#{null}" noSelectionOption="true" />
                    <f:selectItems value="#{estadosMB.estadosMap}" />
                    <p:ajax listener="#{municipiosMB.handleEstadosChange}" update="municipios_eam"/>
                </p:selectOneMenu>
                <p:message for="estados_eam" />

                <h:outputText value="MUNICIPIO:" />
                <p:selectOneMenu id="municipios_eam" valueChangeListener="#{municipiosMB.selectOneMenuListener}"
                    value="#{municipiosMB.idMunicipio}" label="Municipios"
                    converter="javax.faces.Integer" style="width:200px;" required="true">
                    <f:selectItem itemLabel="Seleccione un Municipio"
                        itemValue="#{null}" />
                    <f:selectItems value="#{municipiosMB.municipiosMap}" />
                    <p:ajax listener="#{municipiosMB.handleMunicipioSelectedChange}" />
                </p:selectOneMenu>
                <p:message for="municipios_eam" />

bean代码:

    @ManagedBean(name = "municipiosMB")
    @ViewScoped
    public class MunicipiosMB implements Serializable {

        /**
         * 
         */
        private static final long serialVersionUID = 112312323213445L;

        private static Logger logger = LoggerFactory.getLogger(MunicipiosMB.class);

        @ManagedProperty(value = "#{MunicipiosService}")
        private MunicipiosService municipioService;

        @ManagedProperty(value = "#{estadosMB}")
        private EstadosMB estadosMB;



        private Map<String, String> municipiosMap;
        private Municipio selectedMunicipio;
        private String clave;
        private Estados estado;
        private Integer id;
        private String nombre;
        private String siglas;
        private String estado_clave;
        private Municipio municipio;
        private Integer idMunicipio;

        public void updateMunicipio(Municipio municipio) {
            this.clave = municipio.getIdEstado().getClave();
            this.id = municipio.getId();
            this.nombre = municipio.getNombre();
            this.setMunicipio(municipio);
        }

        public Municipio getMunicipio() {
            return municipio;
        }

        public void setMunicipio(Municipio municipio) {
            this.municipio = municipio;
        }

        public String getClave() {
            return clave;
        }

        public void setClave(String clave) {
            this.clave = clave;
        }

        public Estados getEstado() {
            return estado;
        }

        public void setEstado(Estados estado) {
            this.estado = estado;
        }

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public String getNombre() {
            return nombre;
        }

        public void setNombre(String nombre) {
            this.nombre = nombre;
        }

        public String getSiglas() {
            return siglas;
        }

        public void setSiglas(String siglas) {
            this.siglas = siglas;
        }

        public Municipio getSelectedMunicipio() {
            return selectedMunicipio;
        }

        public void setSelectedMunicipio(Municipio selectedMunicipio) {
            this.selectedMunicipio = selectedMunicipio;
        }

        public MunicipiosService getMunicipioService() {
            return municipioService;
        }

        public void setMunicipioService(MunicipiosService municipioService) {
            this.municipioService = municipioService;
        }

        public Map<String, String> getMunicipiosMap() {

            return municipiosMap = municipioService.getMunicipiosByClaveEstado(estadosMB.getClave());
        }

        public void setMunicipiosMap(Map<String, String> municipiosMap) {
            this.municipiosMap = municipiosMap;
        }

        public EstadosMB getEstadosMB() {
            return estadosMB;
        }

        public void setEstadosMB(EstadosMB estadosMB) {
            this.estadosMB = estadosMB;
        }



        public Integer getIdMunicipio() {
            return idMunicipio;
        }

        public void setIdMunicipio(Integer idMunicipio) {
            this.idMunicipio = idMunicipio;
        }

        public void handleEstadosChange() {
            try {
                if (estadosMB.getClave() != null || !estadosMB.getClave().equals("77")) {
                    this.idMunicipio=0;
                    logger.info("  valor muncipio "+ this.idMunicipio);
                    logger.info("La clave seleccionada es "+estadosMB.getClave());
                    this.setMunicipiosMap(municipioService.getMunicipiosByClaveEstado(estadosMB.getClave()));
                    logger.info("Clave Estado Seleccionado:  " + estadosMB.getClave());
                    logger.info("Clave Municipio Seleccionado:  " + this.idMunicipio);
                } else {
                    this.idMunicipio=0;
                    this.setMunicipiosMap(new HashMap<String, String>());
                }
            } catch (NullPointerException e) {
                logger.info("EstadosMB Null");
                this.setMunicipiosMap(new HashMap<String, String>());
            }
        }

        public void handleMunicipioSelectedChange() {
            logger.info("municipio seleccionado:::::: "+this.getIdMunicipio());
            logger.info("municipio seleccionado2:::::: "+this.getId());
        }

        public Municipio selectedMunicipio() {
            return municipioService.getMunicipiosById(this.getId());
        }

        public void selectOneMenuListener(ValueChangeEvent event) {
            //This will return you the newly selected
            //value as an object. You'll have to cast it.
            Object newValue = event.getNewValue(); 
            logger.info("valor nuevo"+ newValue.toString());
            //The rest of your processing logic goes here...
        }

    }

I don't have any idea, why it is happending here...My EstadosMB

@ManagedBean(name="estadosMB")
@ViewScoped
public class EstadosMB implements Serializable {

    @ManagedProperty(value="#{EstadosService}")
    private EstadosService estadosService;

    private String clave = "";
    private Map<String,String> estadosMap;

    public EstadosService getEstadosService() {
        return estadosService;
    }

    public void setEstadosService(EstadosService estadosService) {
        this.estadosService = estadosService;
    }

    public Map<String, String> getEstadosMap() {
        return estadosMap = estadosService.getEstadosMap();
    }

    public void setEstadosMap(Map<String, String> estadosMap) {
        this.estadosMap = estadosMap;
    }

    public String getClave() {
        return clave;
    }

    public void setClave(String clave) {
        this.clave = clave;
    }



}

有两种解决方法:

  1. 通过添加以下行更新 bean 中侦听器方法中的菜单:

    RequestContext.getCurrentInstance().update("municipios_eam");
    
  2. 使用 p:remoteCommand 更新第二个菜单,而不是:

    <p:ajax listener="#{municipiosMB.handleEstadosChange}" update="municipios_eam"/>
    

    使用:

    //the remoteCommand should be placed before the first menu
    <p:remoteCommand name="updateMuncipios_eam" update="municipios_eam"/>
    
    <h:outputText value="ESTADO:" />
    //some more code
    <p:ajax listener="#{municipiosMB.handleEstadosChange}" oncomplete="updateMuncipios_eam()/>