2015-06-12 2 views
-1

У меня есть этот код:Просмотр не обновлял

<h:selectOneMenu id="select" value="#{bean.code}" 
         valueChangeListener="#{bean.setAdress}"> 
    <f:selectItems value="#{bean.list}" /> 
     <f:ajax execute="dest" render="dest" /> 
</h:selectOneMenu> 

<h:selectOneRadio id="adressChoice" value="#{bean.choice}"> 
     <f:selectItem id="item1" itemLabel="Post adress" itemValue="1" /> 
     <f:selectItem id="item2" itemLabel="Other" itemValue="2" /> 
     <f:ajax execute="adressChoice" render="dest" /> 
</h:selectOneRadio> 

<h:inputText id="dest" value="#{bean.dest}" /> 

В моем боба, у меня есть этот метод:

public void setAdress(final ValueChangeEvent event) { 
     if (choice.equals("1")) { 
      dest = "rererer"; 
     } 
} 

Моя проблема в том, даже если метод setAdress называется, мой inputText не делает изменение. Зачем? Это из-за атрибута execute?

Спасибо.

+0

Значит, вы пишете 'a' во входной текст, затем вы выбираете другое значение в selectmenu, а затем вы ожидаете увидеть« rererer »в тексте ввода? – user1983983

+0

Да, вот что я ожидаю ... Но его ценность всегда «а». Что я делаю не так? – Chris

+0

Интересно: http://stackoverflow.com/a/12534232/2459449 – Omar

ответ

0

valueChangeListener вызывается после проверки и перед обновлением модели (в JSF жизненного цикла), так что значение не изменилось использование:

<h:selectOneMenu id="select" value="#{bean.code}"> 
    <f:selectItems value="#{bean.list}" /> 
     <f:ajax listener="#{bean.setAdress}" /> 
</h:selectOneMenu> 

public void setAdress(AjaxBehaviorEvent event) { 
    //set value here. 
} 

или использовать getNewValue внутри valueChangeListener, чтобы получить новое значение не используя свойство компонента.

Пример:

JSF Контроллер:

import java.util.ArrayList; 
import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.faces.event.AjaxBehaviorEvent; 

public class Bean { 

    private String choice; 

    public String getChoice() { 
     return choice; 
    } 
    public void setChoice(String choice) { 
     this.choice = choice; 
    } 
    private String code; 

    private String dest; 

    private List<String> list; 

    @PostConstruct 
    public void init() 
    { 
     list=new ArrayList<String>(); 
     list.add("a"); 
     list.add("b"); 
    } 
    public void setAdress(AjaxBehaviorEvent event) { 
     //set value here. 
     if (choice.equals("1")) { 
      dest = "rererer"; 
     } 
     System.out.println("code: "+code); 
    } 
    public String getCode() { 
     return code; 
    } 
    public void setCode(String code) { 
     this.code = code; 
    } 
    public List<String> getList() { 
     return list; 
    } 
    public void setList(List<String> list) { 
     this.list = list; 
    } 
    public String getDest() { 
     return dest; 
    } 
    public void setDest(String dest) { 
     this.dest = dest; 
    } 


} 

страницы JSF:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui"> 
<h:head> 
</h:head> 
<h:body> 
    <h:form id="main"> 


     <table> 


      <tr> 
       <td colspan="2"><h:selectOneMenu id="select" 
         value="#{bean.code}"> 
         <f:selectItems value="#{bean.list}" /> 
         <f:ajax listener="#{bean.setAdress}" render="dest" 
          execute="select adressChoice" /> 
        </h:selectOneMenu></td> 
      </tr> 
      <tr> 
       <td><h:selectOneRadio id="adressChoice" value="#{bean.choice}"> 
         <f:selectItem id="item1" itemLabel="Post adress" itemValue="1" /> 
         <f:selectItem id="item2" itemLabel="Other" itemValue="2" /> 

        </h:selectOneRadio></td> 
      </tr> 
      <tr> 
       <td><h:inputText id="dest" value="#{bean.dest}" /></td> 
      </tr> 
     </table> 
    </h:form> 
</h:body> 
</html> 

, когда значение изменяется setAddress будет называться.

+0

Я пробовал это, и он все еще не работает ... мой метод setAdress даже не вызван ... Я полностью потерялся здесь ... – Chris

+0

@ Крис попробуйте пример, который я вложил в ответ –

+0

Да, метод вызывается:) Дело в том, что мои ценности никогда не обновляются. В строке 'System.out.println (" code: "+ code);', это старый код, который отображается. Я попытался поставить 'execute =" select ", но у меня такая же проблема ... – Chris

Смежные вопросы