Зачем мне нужно вкладывать компонент с rendered = «# {some}» в другой компонент, если я хочу его обновить с помощью ajax?

Итак, я нашел несколько ответов, близких к этому, и нашел достаточно, чтобы исправить возникшую у меня проблему. Но даже в этом случае мне любопытно понять, как это работает. Позвольте мне проиллюстрировать это примером:

У меня есть страница 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>

Теперь эти изменения позволяют всем работать нормально. Я бы согласился с этим ... но, думаю, я тоже ищу немного понимания. Любое понимание того, почему я должен вкладывать эти компоненты? Я точно что-то упускаю!

32
задан BalusC 10 February 2016 в 08:58
поделиться