为什么我需要在另一个组件中使用rendered =“#{some}”嵌套一个组件,当我想要更新它时?

所以我发现了几个答案,我已经find了足够的解决我所遇到的问题。 但是,即使如此,我也很好奇为了解这个问题。 让我以一个例子来说明:

我有一个facelet .xhtml页面,看起来像这样(缩短)。

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

现在,为了简洁起见,我不会发布所有的支持bean代码,但是我有这样的一些东西:

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

其中searchResults是一个ArrayList<Objects> 。 search后,它不是空 – 在多个testing中检查(可以为空,但不是在我正在做的testing)。

现在。 这是行不通的。

但是,如果我把dataTableembedded另一个,让我们说panelGroup ,它将工作。

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

现在,这个改变可以让一切工作正常。 我会好起来的…但我想我也在寻求一些理解。 任何洞悉,为什么我要嵌套这些组件? 我肯定错过了一些东西!

Ajax更新由客户端的JavaScript语言执行。 JavaScript有权访问的所有内容都是HTML DOM树。 如果JSF不向HTML输出提供任何组件,那么在HTML DOM树中没有任何东西可以在Ajax更新时通过JavaScript获得。 JavaScript无法通过其ID获取所需的元素。

只有将条件化的JSF呈现组件包装在总是呈现给HTML输出的另一个组件中,并且始终呈现在HTML DOM树中,并始终可以通过JavaScript获取时,它才会起作用。 在ajax渲染/更新期间引用包装组件。

也可以看看:

  • JSF2中的通信 – 对本身有条件呈现的内容进行Ajax呈现