2012-11-10 19 views
12

Szybkie pytanie. Nie zdarzyło mi się to wcześniej podczas pracy z SelectOneMenu. To jest mój kod.p: selectOneMenu nie ustawia wartości w fasoli

<h:outputLabel for="listaRegiones" value="Región: " /> 
<p:selectOneMenu id="listaRegiones" value="#{nuevaProvincia.regionSelect}" required="true"> 
    <f:selectItems value="#{nuevaProvincia.regiones}" /> 
</p:selectOneMenu> 
<p:message for="listaRegiones" /> 

I to jest moja fasola.

@ManagedBean(name="nuevaProvincia") 
@ViewScoped 
public class nuevaProvincia implements Serializable { 

    public static final long serialVersionUID = 1L; 

    public nuevaProvincia() throws DAOException { 
     this.provincia = new Provincia(); 
     this.regiones = new ArrayList<SelectItem>(); 
     ArrayList<Region> regs = new ArrayList<Region>(); 
     try 
     { 
      regs = Region.obtenerRegiones(); 
     } 
     catch(DAOException e) 
     { 
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Hubo un error: "+e.getMessage(), "Hubo un error: "+e.getMessage())); 
     } 
     if(regs.size()>0) 
     { 
      for(Region r : regs) 
      { 
       SelectItem item = new SelectItem(r.getCodigo(), r.getNombre()); 
       regiones.add(item); 
      } 
      this.regionSelect = regs.get(0).getCodigo(); 
     } 
     else 
      this.regionSelect = ""; 
    } 

    public void verificaProvincia() throws DAOException { 
     provincia.getRegion().setCodigo(regionSelect); 
     try 
     { 
      if(this.provincia.estaCreado()) 
       FacesContext.getCurrentInstance().addMessage("frmIngProvincia:provCodigo", new FacesMessage(FacesMessage.SEVERITY_WARN, "El código de provincia ingresado ya existe.", "El código de provincia ingresado ya existe.")); 
      else 
       FacesContext.getCurrentInstance().addMessage("frmIngProvincia:provCodigo", new FacesMessage(FacesMessage.SEVERITY_INFO, "El código de provincia ingresado no existe.", "El código de provincia ingresado no existe.")); 
     } 
     catch(DAOException e) 
     { 
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Hubo un error: "+e.getMessage(), "Hubo un error: "+e.getMessage())); 
     } 
    } 

    public void insertaProvincia() throws DAOException { 
     try 
     { 
      provincia.getRegion().setCodigo(regionSelect); 
      provincia.guardar(); 
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Provincia ingresada con éxito", "Provincia ingresada con éxito")); 
     } 
     catch(DAOException e) 
     { 
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Hubo un error: "+e.getMessage(), "Hubo un error: "+e.getMessage())); 
      throw e; 
     } 
    } 

    //Getters and setters for everything   

    //Privados 
    private Provincia provincia; 
    private String regionSelect; 
    private List<SelectItem> regiones; 
} 

Problem jest następujący: kiedy tylko zmienić wartość w moim selectonemenu wartość w fasoli podkładu nie jest ustawiony (chociaż mam setter dla regionSelect). Dlaczego tak się stało?

+0

Jeśli twoja linia SelectItem item = new SelectItem (r.getCodigo(), r.getNombre()); podaje coś innego niż String jako ItemValue, otrzymasz błąd nieprawidłowej wartości (możesz spróbować użyć , aby sprawdzić, czy coś jest nie tak) –

+0

Obie wartości ustawione w SelectItem są ciągami, i '' nie mówi mi nic nowego. –

+0

Czy masz inne pola w tym formularzu? Jeśli tak, czy inne pola są aktualizowane? –

Odpowiedz

21

Znalazłem błąd i było ... dość dziwne i poszlakowe. Dodałem następującą linię do SelectOneMenu:

<p:ajax event="change" update="@this" /> 

i teraz działa dobrze.

+1

Doskonale, nadal korzystam z RichFaces, więc myślę, że są pewne różnice! –

+0

Jest możliwe, że oba są zupełnie różne w swoich zachowaniach! –

+3

To oczekiwane zachowanie. Twój przykład ustawi wartość 'selectOneMenu' na formularzu submit. Jeśli chcesz ustawić to za pomocą ajax, musisz to określić. Proszę oznaczyć swój post jako odpowiedź. –

0
<p:selectOneMenu id="listaRegiones" value="#{nuevaProvincia.regionSelect}" required="true"> 
    <f:selectItems value="#{nuevaProvincia.regiones}" /> 
</p:selectOneMenu> 

powinny być

<p:selectOneMenu id="listaRegiones" value="#{nuevaProvincia.regionSelect}" required="true"> 
    <f:selectItems value="#{nuevaProvincia.regiones}" var="region" 
     itemValue = "#{region}"/> 
</p:selectOneMenu> 

Dlatego trzeba mieć wywołania AJAX, aby zaktualizować kiedy nastąpiła zmiana. Nigdy nie ustawiasz wartości.

+0

Czy 'var =" region "itemValue =" # {region} "' czy to zostało przesłuchane? –

-1

Odkryłem, kiedy miałem ten problem, to z powodu @ViewScoped. Zamiast tego zadziałało dobrze.

Jedną z ciekawszych rzeczy jest to, że w innym projekcie z ViewScoped zadziałało. Nie mogę wytłumaczyć.

+1

Najprawdopodobniej użyłeś niewłaściwej kombinacji adnotacji '@ ViewScoped' i' @ Named'/'@ ManagedBean'. Gdybyś wziął niewłaściwą "@ SessionScoped", nie udało się ... – Kukeltje

Powiązane problemy