【问题标题】:How to load second selectOneMenu on change of first selectOneMenu? [duplicate]如何在更改第一个 selectOneMenu 时加载第二个 selectOneMenu? [复制]
【发布时间】:2012-02-07 04:33:42
【问题描述】:

我有 2 个<h:selectOneMenu> 组件,其中一个取决于另一个的选择。当您选择第一个菜单组件的一个值时,第二个会随着第一个菜单的onchange="submit()"valueChangeListener="#{Usuario.cmbDatos_action}" 事件而变化:

<h:selectOneMenu id="cmbCombo" binding="#{Usuario.cmbDatos}" value="#{Usuario.id}" 
    onchange="submit()" valueChangeListener="#{Usuario.cmbDatos_action}">
    <f:selectItems value="#{beanCombos.datos}"></f:selectItems>
</h:selectOneMenu>

就像所选国家的国家和城市。第一个菜单加载如下:

@ManagedBean
@RequestScoped
public class BeanCombos {

    private List<SelectItem> Datos;

    public BeanCombos() {
        try {
            clsConexion objConexion = new clsConexion();
            String strSQL = "SELECT * FROM Usuarios";            
            objConexion.ResultSetSQL = objConexion.EjecutarConsulta(strSQL);
            Datos = new ArrayList<SelectItem>();

            while (objConexion.ResultSetSQL.next()) {
                Usuario objUsuario = new Usuario();                
                objUsuario.setId(String.valueOf(objConexion.ResultSetSQL.getInt("Codigo")));
                objUsuario.setNombre(objConexion.ResultSetSQL.getString("Nombres").toUpperCase());
                Datos.add(new SelectItem(objUsuario.getId(), objUsuario.getNombre()));
            }
        } catch(Exception ex) {
            String strError = ex.getMessage().toString();            
        }
    }

    public List<SelectItem> getDatos() {
        return Datos;
    }
}

但是当我选择第一个菜单的一个值时,我不知道如何加载下一个菜单。我试过如下:

public String cmbDatos_action() {
    try {
        int intValor = Integer.parseInt(cmbDatos.getValue().toString());
    } catch(Exception ex) {

    }

    return null;
}

我可以在方法cmbDatos_action()的哪个部分输入代码来加载第二个菜单?

【问题讨论】:

    标签: jsf


    【解决方案1】:

    valueChangeListener 应该引用一个采用 ValueChangeEvent 参数并返回 void 的方法。

    public void cmbDatos_action(ValueChangeEvent event) {
        // ...
    }
    

    但是您在验证方面会遇到麻烦,因为您基本上是使用onchange="submit()" 提交整个 表单。您还需要将immediate="true" 添加到第一个菜单组件。有关具体示例的详细说明,另请参阅this article

    由于您似乎已经在使用 JSF 2.x,我建议您忘记这个基于 JSF 1.x 的解决方法,直接使用 JSF 2.x &lt;f:ajax&gt; 方法,这种方法更易于编程。

    这是一个基于“国家”和“城市”示例的启动示例:

    <h:selectOneMenu value="#{bean.country}" converter="countryConverter">
        <f:selectItems value="#{bean.countries}" var="country" itemValue="#{country}" itemLabel="#{country.name}" />
        <f:ajax listener="#{bean.changeCountry}" render="cities" />
    </h:selectOneMenu>
    <h:selectOneMenu id="cities" value="#{bean.city}" converter="cityConverter">
        <f:selectItems value="#{bean.cities}" var="city" itemValue="#{city}" itemLabel="#{city.name}" />
    </h:selectOneMenu>
    

    举个例子

    @ManagedBean
    @ViewScoped
    public class Bean {
    
        private List<Country> countries;
        private Country country;
        private List<City> cities;
        private City city;
    
        @EJB
        private DataService service;
    
        @PostConstruct
        public void init() {
            countries = service.getCountries();
        }
    
        public void changeCountry() {
            cities = service.getCities(country);
        }
    
        // ...
    }
    

    【讨论】:

    • 感谢您的完整。
    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多