Зачем мне вкладывать компонент с render ="#{some}" в другой компонент, когда я хочу обновить его с помощью ajax?
Итак, я нашел несколько ответов, близких к этому, и я нашел достаточно, чтобы решить проблему, которая у меня была. Но даже в этом случае мне любопытно понять, как это происходит. Позвольте мне проиллюстрировать это на примере:
У меня есть лицо .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>
Теперь, ради краткости, я не буду публиковать весь код бина, но у меня есть что-то вроде этого:
public void find() {
searchResults = setResults(true);
}
куда searchResults
является ArrayList<Objects>
, После поиска он не является нулевым - проверяется в нескольких тестах (может быть нулевым, но не в тестировании, которое я делаю).
Сейчас. Это не работает.
Но если я вложу 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>
Теперь эти изменения позволяют все нормально работать. Я был бы в порядке с этим... но я думаю, что я тоже ищу немного понимания. Любое понимание того, почему я должен вкладывать эти компоненты? Я, безусловно, что-то упустил!
1 ответ
Обновление Ajax выполняется языком JavaScript на стороне клиента. Все, к чему JavaScript имеет доступ, это дерево HTML DOM. Если JSF не отображает какой-либо компонент в вывод HTML, то в дереве HTML DOM нет ничего, что может быть получено JavaScript при обновлении Ajax. JavaScript не может получить нужный элемент по его идентификатору.
Это будет работать только в том случае, если вы поместите условно представленный в JSF компонент в другой компонент, который всегда отображается в выводе HTML и, следовательно, всегда присутствует в дереве HTML DOM и, следовательно, всегда доступен для JavaScript. Вместо этого обращайтесь к этому компоненту-оболочке во время рендеринга / обновления ajax.