【问题标题】:valuechangelistener does not populate values in text boxvaluechangelistener 不填充文本框中的值
【发布时间】:2012-02-03 00:47:51
【问题描述】:

这是我的jsp:

<h:selectOneMenu value="#{member.dependentName}" onchange="this.form.submit()"
immediate="true" valueChangeListener="#{member.getDependentAddress}">
   <f:selectItems value="#{member.dependentList}" />
 </h:selectOneMenu> 
   <h:inputText value="#{member.personName}" immediate="true" />
   <h:inputText value="#{member.dob}" immediate="true" />

这个,函数 valuechangelistener 触发。

 public void getDependentAddress(ValueChangeEvent e) {  
    setPersonName((getDependentsList().get(e.getNewValue().toString())
            .getDependentName()));
    setDob(getDependentsList().get(e.getNewValue().toString()).getBirth());
    System.out.println("New dob value : " + dob);
    System.out.println("New name value : " + personName);
    FacesContext.getCurrentInstance().renderResponse();
}

这两个系统输出在控制台中提供了新值,但是一旦页面加载,这些字段就是空白的。我已经尝试了 bean 的所有范围。不去。我错过了什么?

谢谢

【问题讨论】:

    标签: jsf valuechangelistener


    【解决方案1】:

    你什么都没错过。你的东西太多了。要使其正常工作,您应该从要更改的组件中删除 immediate="true"

    <h:selectOneMenu value="#{member.dependentName}" onchange="this.form.submit()"
       immediate="true" valueChangeListener="#{member.getDependentAddress}">
       <f:selectItems value="#{member.dependentList}" />
    </h:selectOneMenu> 
    <h:inputText value="#{member.personName}" />
    <h:inputText value="#{member.dob}" />
    

    UIInput 组件上的 immediate="true" 将导致其验证阶段改为在应用请求值阶段进行。这使您有机会在valueChangeListener 方法中使用FacesContext#responseComplete(),从而跳过其他没有设置immediate="true" 的组件被处理。正如您现在所做的那样,使用immediate="true",它们也被处理了。


    请注意,这本质上是旧 JSF 1.x 时代的 hack。如果您已经在使用 JSF 2.x,则应该改用 &lt;f:ajax listener&gt;

    <h:selectOneMenu value="#{member.dependentName}">
       <f:selectItems value="#{member.dependentList}" />
       <f:ajax listener="#{member.getDependentAddress}" render="name dob" />
    </h:selectOneMenu> 
    <h:inputText id="name" value="#{member.personName}" />
    <h:inputText id="dob" value="#{member.dob}" />
    

    public void getDependentAddress() {
        Dependent dependent = getDependentsList().get(dependentName); // Isn't that actually a Map instead of List?
        personName = dependent.getDependentName();
        dob = dependent.getBirth();
    }
    

    【讨论】:

    • 有效!我所有在 valuechangelistener 上的谷歌搜索都指向你的博客。很棒的博客。谢谢你。注意:应用程序将在旧服务器上运行,所以我必须坚持使用 JSF 1.X。
    猜你喜欢
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2013-11-01
    • 2021-12-04
    • 1970-01-01
    • 2021-08-20
    相关资源
    最近更新 更多