Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Problemas con el RENDERED en JSF activado por AJAX

Estas en el tema de Problemas con el RENDERED en JSF activado por AJAX en el foro de Java en Foros del Web. Hola muy buenas, Ando desesperado porque no se por qué no me funciona el RENDERED en JSF que cambio por AJAX. En la JSF tengo: ...
  #1 (permalink)  
Antiguo 10/03/2014, 13:51
 
Fecha de Ingreso: enero-2014
Mensajes: 17
Antigüedad: 10 años, 3 meses
Puntos: 0
Problemas con el RENDERED en JSF activado por AJAX

Hola muy buenas,

Ando desesperado porque no se por qué no me funciona el RENDERED en JSF que cambio por AJAX.

En la JSF tengo:

Código:
            <f:view>
                <h:form>
                    <p:panel header="#{msgs.createTitlePage}" styleClass="cajamediana">
                        <h:panelGrid columns="2" cellpadding="10">
                            
                            <p:outputLabel value="#{msgs.typeOfObject}"/>
                            <p:selectOneMenu value="#{drdObjectMB.typeOfObjectSelected}">                                                                   
                                <f:selectItem itemValue="#{msgs.selectOriginal}" itemLabel="#{msgs.selectOriginal}"/>
                                <f:selectItem itemValue="#{msgs.selectAdapted}" itemLabel="#{msgs.selectAdapted}"/>
                                <p:ajax event="change" update="fileNameOr,descriptionFile,hasAdaptationText,hasAdaptation"
                                        listener="#{drdObjectMB.updateOutputLabels}"/>  
                            </p:selectOneMenu>

                            <p:outputLabel id="fileNameOr" value="#{drdObjectMB.createNameFileText}"/>
                            <p:inputText value="#{drdObjectMB.fileName}" size="25">
                            </p:inputText>

                            <p:outputLabel id="descriptionFile" value="#{drdObjectMB.descriptionFileText}"/>
                            <p:inputTextarea value="#{drdObjectMB.description}" 
                                             rows="2" cols="25" />

                            <p:outputLabel id="hasAdaptationText" value="#{msgs.createHasAdaptation}" rendered="#{drdObjectMB.hideFields}"/>
                            <p:inputText id="hasAdaptation" value="#{drdObjectMB.hasAdaptation}" rendered="#{drdObjectMB.hideFields}" size="25">
                            </p:inputText>
Con el selectOneMenu consigo cambiar los outputLabel pero no consigo ocultar los outpulabel (id="hasAdaptationText") y inputText (id="hasAdaptation").

La clase java drdObjectMB con la función updateOutputLabels cambia los textos de los outputlabel y el campo boolean hideFields a TRUE y FALSE dependiendo del valos del selectOneMenu.

Código:
    public void updateOutputLabels(){
        
        if (this.typeOfObjectSelected.equals("Objeto original") || this.typeOfObjectSelected.equals("Original Object") ){
            this.typeOfObjectSelected = constantes.Constantes.obTypeOr;
            this.createNameFileText=utilities.Utility.readPropertiesByKey("createNameFileOr");
            this.descriptionFileText=utilities.Utility.readPropertiesByKey("createDescriptionFileOr");
            this.hideFields = true;
        }else if (this.typeOfObjectSelected.equals("Objeto adaptado") || this.typeOfObjectSelected.equals("Adapted Object") ){
            this.typeOfObjectSelected = constantes.Constantes.obTypeAd;
            this.createNameFileText= utilities.Utility.readPropertiesByKey("createNameFileAd");
            this.descriptionFileText=utilities.Utility.readPropertiesByKey("createDescriptionFileAd");  
            this.hideFields = false;
        }
    }
Pero no se ocultan los campos.
Por qué puede ser?!?!
  #2 (permalink)  
Antiguo 10/03/2014, 21:35
Avatar de farfamorA  
Fecha de Ingreso: noviembre-2010
Ubicación: Lima
Mensajes: 136
Antigüedad: 13 años, 5 meses
Puntos: 24
Respuesta: Problemas con el RENDERED en JSF activado por AJAX

Esta respuesta puede ayudarte, a mi me sirvió:
http://stackoverflow.com/a/9010771/1895645
"Ajax updating is performed by JavaScript language in the client side. All which JavaScript has access to is the HTML DOM tree. If JSF does not render any component to the HTML output, then there's nothing in the HTML DOM tree which can be obtained by JavaScript upon Ajax update. JavaScript cannot get the desired element by its ID."

Visita también el link que adjunta esa respuesta:
http://balusc.blogspot.com/2011/09/c...onallyRendered
" You need to ensure that the render ID points to a component which is already present in the JSF-generated HTML output."

Básicamente te recomienda que debes hacer esto:
Código XML:
Ver original
  1. <h:panelGroup id="hasAdaptation">
  2.        <p:outputLabel id="hasAdaptationText" value="#{msgs.createHasAdaptation}"  />
  3.        <p:inputText id="hasAdaptation" value="#{drdObjectMB.hasAdaptation}" size="25" />
  4. </h:panelGroup>
Y usar el atributo render de la etiqueta f:ajax
Código XML:
Ver original
  1. <f:ajax render=":hasAdaptation" />

Espero que te sirva de ayuda.
  #3 (permalink)  
Antiguo 11/03/2014, 02:54
 
Fecha de Ingreso: enero-2014
Mensajes: 17
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Problemas con el RENDERED en JSF activado por AJAX

Cita:
Iniciado por farfamorA Ver Mensaje
Esta respuesta puede ayudarte, a mi me sirvió:
[url]http://stackoverflow.com/a/9010771/1895645[/url]
"Ajax updating is performed by JavaScript language in the client side. All which JavaScript has access to is the HTML DOM tree. If JSF does not render any component to the HTML output, then there's nothing in the HTML DOM tree which can be obtained by JavaScript upon Ajax update. JavaScript cannot get the desired element by its ID."

Visita también el link que adjunta esa respuesta:
[url]http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#AjaxRenderingOfContentWhichIsByItselfCondi tionallyRendered[/url]
" You need to ensure that the render ID points to a component which is already present in the JSF-generated HTML output."

Básicamente te recomienda que debes hacer esto:
Código XML:
Ver original
  1. <h:panelGroup id="hasAdaptation">
  2.        <p:outputLabel id="hasAdaptationText" value="#{msgs.createHasAdaptation}"  />
  3.        <p:inputText id="hasAdaptation" value="#{drdObjectMB.hasAdaptation}" size="25" />
  4. </h:panelGroup>
Y usar el atributo render de la etiqueta f:ajax
Código XML:
Ver original
  1. <f:ajax render=":hasAdaptation" />

Espero que te sirva de ayuda.
Joder, muchísimas gracias!!!

Era eso!!

Al final he englobado las etiquetas que quería ocultar/mostrar en elementos <h: y sí que me funciona:

Código:
                            <p:outputLabel value="#{msgs.typeOfObject}"/>
                            <p:selectOneMenu value="#{drdObjectMB.typeOfObjectSelected}">                                                                   
                                <f:selectItem itemValue="#{msgs.selectOriginal}" itemLabel="#{msgs.selectOriginal}"/>
                                <f:selectItem itemValue="#{msgs.selectAdapted}" itemLabel="#{msgs.selectAdapted}"/>
                                <f:ajax render="fileNameOr descriptionFile hasAdaptation hasAdaptation2" listener="#{drdObjectMB.updateOutputLabels}" event="change" />
                            </p:selectOneMenu>



                            <h:column>
                                <h:panelGrid id="hasAdaptation">
                                    <p:outputLabel value="#{msgs.createHasAdaptation}" rendered="#{drdObjectMB.hideFields}"/>
                                </h:panelGrid>
                            </h:column>
                            <h:column>
                                <h:panelGrid id="hasAdaptation2">
                                    <p:inputText value="#{drdObjectMB.hasAdaptation}" rendered="#{drdObjectMB.hideFields}" size="25">
                                    </p:inputText>       
                                </h:panelGrid>
                            </h:column>

Etiquetas: jsf
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:01.