2012-04-09 9 views
0

Ich habe ein Formular, wo ich eine rich:select ob sie Option A oder Option B eine h:inputText gerendert haben. Zunächst wird die h:inputText entsprechend der Option A gerendert und wenn ich es leer lasse erscheint die requiredMessage und alles ist in Ordnung. Jetzt, wenn ich die zweite Option der rich:select die h:inputText für Option B wird gerendert, aber wenn ich es leer lassen die requiredMessage erscheint nicht.Rendern Validierung Nachrichten RichFaces

Was fehlt mir?

Mein xhtml Code ist wie folgt:

   <h:panelGrid columns="3"> 
        <h:outputLabel for="tipoPersona">Tipo de persona</h:outputLabel> 
        <rich:select id="tipoPersona" 
           required="true" value="#{userInformationController.tipoPersona}" 
           requiredMessage="Seleccione el tipo de persona" 
           defaultLabel="Seleccione una opción"> 
         <f:selectItems value="#{userInformationController.tipoPersonaOpciones}"/> 
         <f:ajax event="blur" render="tipoPersonaMessage"/> 
         <f:ajax event="selectitem" 
           render="outputLabelCURP inputTextCURP messageCURP outputLabelRFC inputTextRFC messageRFC" 
           listener="#{userInformationController.doRenderCURP}"/> 
        </rich:select> 
        <rich:message id="tipoPersonaMessage" ajaxRendered="true" 
            for="tipoPersona"/> 


        <a4j:outputPanel id="outputLabelCURP"> 
         <h:outputLabel for="CURP" value="CURP" 
             rendered="#{userInformationController.curpRendered}"/> 
        </a4j:outputPanel>       
        <a4j:outputPanel id="inputTextCURP"> 
         <h:inputText id="CURP" required="true" 
            requiredMessage="Introduzca el CURP" 
            rendered="#{userInformationController.curpRendered}"> 
          <f:ajax event="blur" render="curpMessage"/> 
         </h:inputText> 
        </a4j:outputPanel> 
        <a4j:outputPanel id="messageCURP"> 
         <rich:message id="curpMessage" ajaxRendered="true" 
             for="CURP" 
             rendered="#{userInformationController.curpRendered}"/> 
        </a4j:outputPanel> 


        <a4j:outputPanel id="outputLabelRFC"> 
         <h:outputLabel for="RFC" value="RFC" 
             rendered="#{not userInformationController.curpRendered}"/> 
        </a4j:outputPanel> 
        <a4j:outputPanel id="inputTextRFC"> 
         <h:inputText id="RFC" required="true" 
            requiredMessage="Introduzca el RFC" 
            rendered="#{not userInformationController.curpRendered}"> 
          <f:ajax event="blur" render="rfcMessage"/> 
         </h:inputText> 
        </a4j:outputPanel> 
        <a4j:outputPanel id="messageRFC"> 
         <rich:message id="rfcMessage" ajaxRendered="true" 
             for="RFC" 
             rendered="#{not userInformationController.curpRendered}"/> 
        </a4j:outputPanel> 
       </h:panelGrid> 

UPDATE

Ich habe einige Änderungen an der Benutzeroberfläche vorgenommen und jetzt habe ich dieses

  <fieldset> 
       <legend>Datos SURI</legend> 
       <h:panelGrid columns="3"> 
        <h:outputLabel for="tipoPersona">Tipo de persona</h:outputLabel> 
        <rich:select id="tipoPersona" 
           required="true" value="#{userInformationController.tipoPersona}" 
           requiredMessage="Seleccione el tipo de persona" 
           defaultLabel="Seleccione una opción"> 
         <f:selectItems value="#{userInformationController.tipoPersonaOpciones}"/> 
         <f:ajax event="blur" render="tipoPersonaMessage"/> 
         <f:ajax event="selectitem" 
           render="outputLabelCURP inputTextCURP messageCURP 
             outputLabelRFC inputTextRFC messageRFC 
             datosPersonaFisica datosPersonaMoral" 
           listener="#{userInformationController.doRenderTipoPersona}"/> 
        </rich:select> 
        <rich:message id="tipoPersonaMessage" ajaxRendered="true" 
            for="tipoPersona"/> 


        <a4j:outputPanel id="outputLabelCURP"> 
         <h:outputLabel for="CURP" value="CURP" 
             rendered="#{userInformationController.personaFisicaRendered}"/> 
        </a4j:outputPanel>       
        <a4j:outputPanel id="inputTextCURP"> 
         <h:inputText id="CURP" required="true" 
            requiredMessage="Introduzca el CURP" 
            value="#{userInformationController.curp}" 
            rendered="#{userInformationController.personaFisicaRendered}"> 
          <f:ajax event="blur" render="curpMessage identificadorSURI" 
            listener="#{userInformationController.doSearchIdSURI}"/> 
         </h:inputText> 
        </a4j:outputPanel> 
        <a4j:outputPanel id="messageCURP"> 
         <rich:message id="curpMessage" ajaxRendered="true" for="CURP" 
             rendered="#{userInformationController.personaFisicaRendered}"/> 
        </a4j:outputPanel> 


        <a4j:outputPanel id="outputLabelRFC"> 
         <h:outputLabel for="RFC" value="RFC" 
             rendered="#{userInformationController.personaMoralRendered}"/> 
        </a4j:outputPanel> 
        <a4j:outputPanel id="inputTextRFC"> 
         <h:inputText id="RFC" required="true" 
            requiredMessage="Introduzca el RFC" 
            value="#{userInformationController.rfc}" 
            rendered="#{userInformationController.personaMoralRendered}"> 
          <f:ajax event="blur" render="rfcMessage identificadorSURI" 
            listener="#{userInformationController.doSearchIdSURI}"/> 
         </h:inputText> 
        </a4j:outputPanel> 
        <a4j:outputPanel id="messageRFC"> 
         <rich:message id="rfcMessage" ajaxRendered="true" for="RFC" 
             rendered="#{userInformationController.personaMoralRendered}"/> 
        </a4j:outputPanel> 

        <h:outputLabel for="identificadorSURI">Identificador SURI</h:outputLabel> 
        <h:inputText id="identificadorSURI" disabled="true" 
           value="#{userInformationController.identificadorSuri}"/> 

       </h:panelGrid> 
      </fieldset> 

Allerdings fand ich, dass Putting meine Bean in RequestScope feuert nicht den Hörer auf beiden h:inputText (ID = 'CURP' und ID = 'RFC'), während, wenn ich die Bean in ViewScope setzen, der Listener ausgelöst und korrekt verarbeitet wird.

Was ich brauche, ist eigentlich die Bean in RequestScope, weil ich ein ganz neues Formular erstellen muss, ob der Benutzer den Wert der rich:select ändert. Wenn ich den Bereich in ViewScope halte, werden alle Daten innerhalb der Bean gespeichert und ich muss dann die Felder löschen, wenn der Benutzer den Wert der Auswahl ändert.

Kann mir jemand erklären, warum passiert das? Ich könnte nicht herausfinden, was der Trick ist!

Prost

Antwort

1

Eine Anfrage Bohne wird auf jeder einzelnen Anforderung neu erstellt scoped verwenden, auch auf jedem einzelnen Ajax-Request. Wenn Sie also eine Eigenschaft durch Ajax auf einen anderen Wert als den Standardwert ändern (z. B. den für das Attribut rendered zuständigen), wird diese Änderung in den nachfolgenden Anforderungen nicht beibehalten. Daher wird das rendered Attribut effektiv zu false ausgewertet und die Komponente und alle ihre untergeordneten Elemente werden während des Sendens nicht mehr verarbeitet.

Der Ansichtsbereich soll genau dieses Problem lösen. Die Bean bleibt so lange bestehen, wie Sie mit der gleichen Ansicht durch Ajax-Anfragen interagieren, bis Sie zu einer anderen Ansicht navigieren oder die Ansicht neu erstellen. Was die funktionelle Anforderung betrifft, das Formular bei Änderung von <rich:select> neu zu erstellen, tun Sie dies einfach innerhalb der doRenderTipoPersona() Methode.

Wenn Sie sich wirklich an den Anforderungsbereich halten müssen, müssen Sie die Bean-Eigenschaften manuell basierend auf der Anforderungs-Parameterzuordnung im (Post) -Konstruktor beibehalten.

+0

Danke. Das war, was ich mir vorgestellt habe (Ajax schafft neue Anfragen). Was ich getan habe, war, meine Bean im View-Bereich zu belassen und alle Bean-Felder auf '' Listener zu löschen. – BRabbit27

0

Statt Event-Funktion verwenden können Sie die einzelne Ajax-Funktion

<rich:select id="tipoPersona" 
           required="true" value="#{userInformationController.tipoPersona}" 
           requiredMessage="Seleccione el tipo de persona" 
           defaultLabel="Seleccione una opción"> 
         <f:selectItems value="#{userInformationController.tipoPersonaOpciones}"/> 
         <f:ajax event="valueChange" 
           render="tipoPersonaMessage outputLabelCURP inputTextCURP messageCURP outputLabelRFC inputTextRFC messageRFC" 
           listener="#{userInformationController.doRenderCURP}"/> 
        </rich:select> 
+0

Danke für Ihre Antwort.Vielleicht erkläre ich mich falsch, aber das Problem liegt nicht im ** Rich: Select ** Das Problem liegt im ** h: inputText ** (id = 'CURP' und id = 'RFC'). Wenn das Ereignis 'blur' ausgelöst wird, möchte ich, dass der Listener aufgerufen wird, aber nicht. – BRabbit27

+0

ahan..ich habe eine andere Lösung dafür können Sie eine onBlur-Funktion auf Eingabetext aufrufen, wo Sie a4j: jsFunction-Aufruf haben können, die Ihre Listener-Funktion auf der Bean aufrufen. –

0

Nun, das ist eine Lösung.

<a4j:jsFunction name="onBlurRFC" execute="RFC" render = "rfcMessage identificadorSURI" 
    action="#{userInformationController.doSearchIdSURI}" />  

    <h:inputText id="RFC" required="true" 
              requiredMessage="Introduzca el RFC" 
              value="#{userInformationController.rfc}" 
              rendered="#{userInformationController.personaMoralRendered}" onblur="onBlurRFC()"> 
           </h:inputText> 
+0

Warum ist das eine Lösung? –

+0

Sorry, a4j: jsFunction fehlte. a4j: jsFunction löst einen Listener auf einer Bean aus und rendert das Panel. Das Gleiche gilt für den CURP-Eingabetext. –