valueChangeListener添加渲染/禁用属性时不触发

时间:2011-11-24 04:42:50

标签: jsp jsf

我有以下代码和平:

        <h:selectOneMenu id="countrycode"
                styleClass="Width300"
                value="#{customer.countrycode}"
                valueChangeListener="#{customer.countrycodechange}"
                onchange="submit()"
                immediate="true"
                rendered="#{customer.validcountry}">
                <f:selectItem itemValue="None"
                    itemLabel="-------Select a Country------" />
                <f:selectItem itemValue="AU" itemLabel="Australia" />
                <f:selectItem itemValue="NZ" itemLabel="New Zealand" />
        </h:selectOneMenu>

ValueChangeListener仅在我遗漏渲染属性时才有效,渲染属性countrycodechange永远不会被触发!有没有解决的办法?

添加disabled属性也是如此,这会阻止valueChangeListener触发。我的valueChangeListener backbean有:

    public void countrycodechange (ValueChangeEvent vce) {

        PhaseId phaseId = vce.getPhaseId();
        if (phaseId.equals(PhaseId.ANY_PHASE))
        {
            vce.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
            vce.queue();
        }
        else if (phaseId.equals(PhaseId.UPDATE_MODEL_VALUES))
        {
            ...

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

输入组件只有在{/ 1}}和rendered属性分别评估为disabledtrue 表单提交时才会被处理。因此,您需要确保false在表单提交期间对其进行评估,就像在显示表单时一样。显然,在您的情况下,bean是请求作用域,或者#{customer.validcountry}依赖于请求作用域参数,该参数在表单提交期间未正确保留。您需要确保在表单提交期间保留相同的条件。

在JSF 2.0中,将bean放在视图范围而不是请求范围中。但是,看到你的isValidcountry() hack,我认为你还在使用没有视图范围的JSF 1.x.如果没有看到其余的代码,很难提出正确的解决方案。在“是一个有效的国家/地区?”上有一个渲染属性对我来说至少没有意义吗?而输入组件本身应该选择一个有效的国家。