Зачем мне вкладывать компонент с render = "# {some}" в другой компонент, когда я хочу обновить его с помощью ajax? - PullRequest
32 голосов
/ 26 января 2012

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

У меня есть страница лицевой стороны .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 Ответ

62 голосов
/ 26 января 2012

Обновление Ajax выполняется языком JavaScript на стороне клиента. Все, к чему имеет доступ JavaScript, это дерево HTML DOM. Если JSF не отображает какой-либо компонент в вывод HTML, то в дереве HTML DOM нет ничего, что может быть получено JavaScript при обновлении Ajax. JavaScript не может получить нужный элемент по его идентификатору.

Это будет работать только в том случае, если вы поместите условно JSF-визуализированный компонент в другой компонент, который всегда отображается в выводе HTML и, следовательно, всегда присутствует в дереве HTML DOM и, таким образом всегда можно получить с помощью JavaScript. Вместо этого обращайтесь к этому компоненту-оболочке во время рендеринга / обновления ajax.

Смотри также:

...