Итак, я нашел несколько ответов, близких к этому, и нашел достаточно, чтобы исправить возникшую у меня проблему. Но даже в этом случае мне любопытно понять, как это работает. Позвольте мне проиллюстрировать это примером:
У меня есть страница 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
. После поиска он не равен нулю - проверено в нескольких тестах (может быть нулевым, но не в тестировании, которое я выполняю).
Сейчас. Это не работает.
Но если я вложу 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>
Теперь эти изменения позволяют всем работать нормально. Я бы согласился с этим ... но, думаю, я тоже ищу немного понимания. Любое понимание того, почему я должен вкладывать эти компоненты? Я точно что-то упускаю!