valuechangelistener не заполняет значения в текстовом поле - PullRequest
1 голос
/ 02 февраля 2012

Вот мой 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();
}

Два sysout дают новое значение в консоли, но после загрузки страницыполя пустыеЯ перепробовал все возможности для бобов.Нет идтиЧто мне не хватает?

Спасибо

1 Ответ

1 голос
/ 02 февраля 2012

Вы ничего не пропустили. Вы просто что-то слишком много. Чтобы заставить его работать, вы должны удалить 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}" />

immediate="true" в компоненте UIInput приведет к тому, что фаза его проверки будет проходить в фазе применения значений запроса. Это дает вам возможность использовать FacesContext#responseComplete() внутри метода valueChangeListener, пропуская другие компоненты, для которых immediate="true" не установлен из обработки. Как и сейчас, с immediate="true" они также обрабатываются.


Пожалуйста, обратите внимание, что это, по сути, взлом старой версии JSF 1.x. Если вы уже используете JSF 2.x, вам следует использовать <f:ajax listener>.

<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();
}
...