2012-11-10 10 views
12

त्वरित प्रश्न में मान निर्धारित नहीं करता है। SelectOneMenu के साथ काम करते समय यह मेरे साथ नहीं हुआ है। यह मेरा कोड है।पी: selectOneMenu बीन

<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" /> 

और यह मेरा समर्थन बीन है। (हालांकि मैं regionSelect के लिए एक सेटर है) जब भी मैं अपने selectonemenu का मान बदलें, समर्थन सेम में मान सेट नहीं किया जा रहा है:

@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; 
} 

समस्या इस प्रकार है। ऐसा क्यों होगा?

+0

यदि आपकी लाइन SelectItem आइटम = नया चयन Item (r.getCodigo(), r.getNombre()); ItemValue के रूप में स्ट्रिंग से कुछ और दे रहा है, आपको एक खराब मान त्रुटि मिलेगी (आप कुछ हद तक गलत होने पर यह देखने के लिए का उपयोग करने का प्रयास कर सकते हैं) –

+0

SelectItem में सेट दोनों मान स्ट्रिंग हैं, और ' 'मुझे कुछ भी नया नहीं बता रहा है। –

+0

क्या आप इस फॉर्म में अन्य फ़ील्ड हैं? यदि हां, तो क्या अन्य फ़ील्ड अपडेट किए गए हैं? –

उत्तर

21

मुझे त्रुटि मिली और यह ... काफी अजीब और परिस्थितिवादी था। मैंने SelectOneMenu के अंदर निम्न पंक्ति को जोड़ा:

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

और अब यह ठीक काम करता है।

+1

बढ़िया, मैं अभी भी रिचफेस का उपयोग कर रहा हूं इसलिए मुझे लगता है कि कुछ मतभेद हैं! –

+0

यह संभव है कि दोनों अपने व्यवहार पर काफी अलग हैं! –

+3

यह अपेक्षित व्यवहार है। आपका उदाहरण फॉर्म सबमिट पर 'selectOneMenu' मान सेट करेगा। अगर आप इसे AJAX के साथ सेट करना चाहते हैं, तो आपको इसे निर्दिष्ट करना होगा। कृपया अपनी पोस्ट को उत्तर के रूप में चिह्नित करें। –

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

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

है यही कारण है कि आप अद्यतन करने के लिए जब भी इसमें कोई परिवर्तन होने ajax कॉल करना होगा होना चाहिए। आप कभी भी मूल्य निर्धारित नहीं कर रहे हैं।

+0

क्या 'var =" region "itemValue =" # {region} "' क्या उस पर सवाल उठाया गया था? –

-1

मुझे पता चला कि मुझे यह समस्या कब थी, यह @ViewScoped की वजह से थी। SessionScoped का उपयोग करके ठीक काम किया।

एक दिलचस्प बात यह है कि ViewScoped के साथ, एक अन्य परियोजना में, यह काम करता था। मै समझा नही सकता।

+1

आपने संभवतः '@ व्यूस्पेड' और '@ नामांकित'/'@ प्रबंधित बीन 'एनोटेशन के गलत संयोजन का उपयोग किया था। यदि आप गलत '@ सत्र स्कोप्ड' ले लेते तो यह असफल हो जाता ... – Kukeltje

संबंधित मुद्दे