首页 > 解决方案 > ValueChangeEvent 没有得到 newValue

问题描述

我在我的项目中使用 JSF 2.2.13 和 PrimeFaces 6.1.1。并尝试创建更改语言环境的primefaces selectOneMenu。但是当valueChangeListener 被触发时-ValueChangeEvent 始终具有null newValue。

ValeuChangeEvent:
ValeuChangeEvent

这是我的 selectOneMenu:

<p:selectOneMenu value="#{localeBean.localeCode}" id="lang" valueChangeListener="#{localeBean.valueChangeListener}">
    <f:selectItem itemValue="pl" itemLabel="${msg['page.login.language.pl.label']}"/>
    <f:selectItem itemValue="en" itemLabel="${msg['page.login.language.en.label']}"/>
    <p:ajax event="itemSelect" update="@this"/>
</p:selectOneMenu>

还有我的 LocaleBean:

@Named
@SessionScoped
public class LocaleBean implements ILocaleBean, Serializable {
    private String           localeCode;
    private Locale           locale;
    private boolean          initiated = false;
    private static final Log log       = LogFactory.getLog(LocaleBean.class);

    @PostConstruct
    public void init() {
        setDefaultLocale();
        this.localeCode = locale.getLanguage();
        initiated = true;

    }

    public void setLocaleCode(String localeCode) {
        this.localeCode = localeCode;
    }

    public String getLocaleCode() {
        if (!initiated) {
            init();
        }
        return getLocale().toString();
    }

    public void valueChangeListener(ValueChangeEvent event) {

        setLocaleFromString(event.getNewValue().toString());
    }

    @Override
    public Locale getLocale() {
        return locale;
    }

}

标签: jsfprimefacesejb

解决方案


您应该按照 Holger 的建议使用event="valueChange"代替event="itemSelect"或将其留空。

或如文档所述:

如果没有特定事件,则调用默认事件。除了像“change”这样的标准事件之外,当从下拉列表中选择一个项目时,还可以调用自定义“itemSelect”事件。

默认事件:valueChange

选择发生时,所选值尚未提交,因此侦听器将无法看到新值。


推荐阅读