La actualización/renderizado de Ajax no funciona en un componente que tiene un atributo renderizado

Resuelto Artem Moskalev asked hace 11 años • 1 respuestas

Estoy intentando actualizar ajax un componente renderizado condicionalmente.

<h:form>
    ...
    <h:commandButton value="Login" action="#{login.submit}">
        <f:ajax execute="@form" render=":text" />
    </h:commandButton>
</h:form>
<h:outputText id="text" value="You're logged in!" rendered="#{not empty user}" />

Sin embargo, eso no funciona. Puedo asegurar que #{user}realmente está disponible. ¿Cómo se produce esto y cómo puedo solucionarlo?

Artem Moskalev avatar Feb 09 '13 23:02 Artem Moskalev
Aceptado

No es posible volver a renderizar (actualizar) un componente mediante ajax si el componente en sí no se renderiza en primer lugar. El componente siempre debe renderizarse antes de que ajax pueda volver a renderizarlo. Ajax utiliza JavaScript document.getElementById()para encontrar el componente que necesita actualizarse. Pero si JSF no ha representado el componente en primer lugar, entonces JavaScript no puede encontrar nada para actualizar.

La solución es simplemente hacer referencia a un componente principal que siempre se representa.

<h:form>
    ...
    <h:commandButton ...>
        <f:ajax ... render=":text" />
    </h:commandButton>
</h:form>
<h:panelGroup id="text">
    <h:outputText ... rendered="#{not empty user}" />
</h:panelGroup>

Ver también:

  • ¿Por qué necesito anidar un componente con rendered="#{some}" en otro componente cuando quiero actualizarlo con ajax?
  • ¿Cómo averiguar el ID de cliente del componente para la actualización/renderizado de ajax? No se puede encontrar el componente con la expresión "foo" a la que se hace referencia desde "barra"
BalusC avatar Feb 09 '2013 20:02 BalusC