¿Por qué necesito anidar un componente con rendered = “# {some}” en otro componente cuando quiero ajax-update?

Así que encontré algunas respuestas cercanas a esto, y encontré suficiente para solucionar el problema que tenía. Pero aún así, tengo curiosidad por comprender el funcionamiento de esto. Déjame ilustrar con un ejemplo:

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

          #{results.field}    

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

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

Donde searchResults es una ArrayList . Después de una búsqueda, no se verifica nulo en varias pruebas (puede ser nulo, pero no en la prueba que estoy haciendo).

Ahora. Esto no funciona.

Pero si dataTable la dataTable dentro de otra, digamos panelGroup , funcionará.

    #{results.field}    

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

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

Solo funcionará si ajusta el componente condicionalmente JSF-rendering en otro componente que siempre se representa en el resultado HTML y, por lo tanto, siempre presente en el árbol HTML DOM y, por lo tanto, siempre se puede obtener mediante JavaScript. Referencia ese componente envoltorio en su lugar durante ajax render / update.

Ver también:

  • Comunicación en JSF2 – Rendición de contenido Ajax que, por sí misma, se representa condicionalmente