Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do I need to nest a component with rendered="#{some}" in another component when I want to ajax-update it?

So I've found a few answers close to this, and I've found enough to fix the problem I had. But even so, I'm curious as to understand the workings around this. Let me illustrate with an example :

I have a facelet .xhtml page that looks like this (shortned).

<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> 

Now, for the sake of breivity, I will not post all the backing bean code, but I have something of this sort :

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

Where searchResults is an ArrayList<Objects>. After a search, it is not null - checked in multiple tests (can be null, but not in the testing I am doing).

Now. This does NOT work.

But if I nest the dataTable inside another, let's say panelGroup, it will work.

<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> 

Now, this changes allows everything to work fine. I'd be okay with this... but I guess I am seeking a bit of understanding as well. Any insight as to why I have to nest these components? I am surely missing something!

like image 658
blo0p3r Avatar asked Jan 25 '12 21:01

blo0p3r


People also ask

What is a nested component?

A nested component is a child of the parent component that contains it. The child component is positioned and rendered relative to that parent. The minimum size of a container component is determined by the size of its child components.

How does react render nested components?

React Nesting Components In React, we can nest components inside within one another. This helps in creating more complex User Interfaces. The components that are nested inside parent components are called child components. Import and Export keywords facilitate nesting of the components.

What is nesting component in angular?

What is a Nested Component? Angular allows us to have a different child, or nested component, which is the same component we normally use in an Angular application. The difference between them is that this child component contains the logic which can be used into the parent component as a single unit.


1 Answers

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.

It will only work if you wrap the conditionally JSF-rendered component in another component which is always rendered to the HTML output and thus always present in the HTML DOM tree and thus always obtainable by JavaScript. Reference that wrapper component instead during ajax render/update.

See also:

  • Communication in JSF2 - Ajax rendering of content which is by itself conditionally rendered
like image 146
BalusC Avatar answered Sep 16 '22 14:09

BalusC