所以我找到了一些接近这个问题的答案,也找到了足够的解决方案。但是即便如此,我仍然很想了解其中的工作原理。下面举个例子:
我有一个名为.xhtml
的facelet页面,它看起来像这样(缩短版)。
<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>
,它不为 null - 在多个测试中进行了检查(可能为null,但在我进行的测试中不是)。
现在。这个代码是不起作用的。
但是,如果我将 dataTable
嵌套在另一个元素内,比如说 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>
现在,这些更改可以让一切正常运作。我可以接受这个...但我想我也想要一些理解。为什么我必须嵌套这些组件?我肯定漏掉了什么!