¿Por qué necesito anidar un componente con rendered="#{some}" en otro componente cuando quiero actualizarlo con ajax?


Así que he encontrado algunas respuestas cercanas a esto, y he encontrado suficientes para solucionar el problema que tenía. Pero aún así, tengo curiosidad por entender el funcionamiento en torno a esto. Permítanme ilustrar con un ejemplo :

Tengo una página de facelet .xhtml que se ve así (acortada).

<h:form id="resultForm">

    <h:panelGroup class="search_form" layout="block">
        <h:inputText id="lastname" value="#{search.lastname}"/>
        <h:commandButton action="#{search.find}" value="Find">
            <f:ajax execute="lastname" render="resultDisplay"/>
        </h:commandButton>
    </h:panelGroup>

    <h:dataTable value="#{search.searchResults}" var="results" id="resultDisplay"
            rendered="#{!empty search.searchResults}">  
        <h:column>
            #{results.field}
        </h:column>
    </h:dataTable>

</h:form>

Ahora, por el bien de la brevedad, no publicaré todo el código de frijol de respaldo, pero tengo algo de este tipo:

public void find() {
    searchResults = setResults(true);
}

Donde searchResults es un ArrayList<Objects>. Después de una búsqueda, no se registra en null múltiples pruebas (pueden ser nulas, pero no en las pruebas que estoy haciendo).

Ahora. Esto no funciona.

Pero si anido el dataTable dentro de otro, digamos panelGroup, funcionará.

<h:panelGroup id="resultDisplay">
    <h:dataTable value="#{search.searchResults}" var="results"
        rendered="#{!empty search.searchResults}">  
        <h:column>
            #{results.field}
        </h:column>
    </h:dataTable>
</h:panelGroup>

Ahora, estos cambios permiten que todo funcione bien. Estaría bien con esto... pero supongo que estoy buscando un poco de comprensión también. ¿Alguna idea de por qué tengo que anidar estos componentes? ¡Me estoy perdiendo algo!

Author: BalusC, 2012-01-26

1 answers

La actualización de Ajax se realiza mediante el lenguaje JavaScript en el lado del cliente. Todo a lo que JavaScript tiene acceso es al árbol DOM HTML. Si JSF no renderiza ningún componente a la salida HTML, entonces no hay nada en el árbol DOM HTML que pueda ser obtenido por JavaScript tras la actualización Ajax. JavaScript no puede obtener el elemento deseado por su ID.

Solo funcionará si envuelve el componente representado condicionalmente por JSF en otro componente que esté siempre renderizado en la salida HTML y por lo tanto siempre presente en el árbol DOM HTML y por lo tanto siempre obtenible por JavaScript. Haga referencia a ese componente wrapper en su lugar durante ajax render / update.

Véase también:

 60
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-18 16:18:45