Геттеры Rich TabPanel вызываются, когда содержимое вкладки не отображается

У меня есть вопрос о панели вкладок RichFace (3.3.3). Я работал над двумя проектами, в которых использовалась TabPanel. В каждом проекте я заметил, что компоненты, которые находятся на вкладках, которые не видны, по-прежнему вызывают свои методы «геттера».

Например, первая вкладка содержит таблицу данных, и каждый раз, когда с любой из вкладок другие делаются запросы (включая запросы ajax), компонент, связанный с таблицей данных, на первой вкладке все еще вызывается геттер.

Я предполагаю, что это происходит (хотя вкладка в настоящее время не отображается в пользовательском интерфейсе), потому что компонент все еще находится в иерархии компонентов? Другими словами, все компоненты являются дочерними элементами родительской панели вкладок и поэтому обрабатываются при каждом запросе... даже если они не видны.

Хорошо... если мое предположение верно, то мне нужен способ не вызывать логику извлечения данных для вкладок, которые не используются. Я читал сообщения о ленивой загрузке данных (не помещая логику извлечения данных в геттер), потому что геттеры могут вызываться много раз. Я делаю все возможное, чтобы придерживаться этого; проблема, которую я вижу, заключается в том, что, хотя у меня есть bean-компонент, привязанный к таблице (на первой вкладке), определенный с областью запроса, и геттер лениво загружает данные для таблицы, экземпляр bean-компонента создается, а данные pull (лениво) для каждого запроса ajax из других вкладок.

Должен быть способ обойти это, за исключением извлечения всего содержимого из панели вкладок RichFace и развертывания моего собственного.

Я попытался сделать bean-компонент привязанным к сеансу таблицы и «кэшировать» данные, которые геттер возвращает в таблицу, но проблема в том, что нет метода жизненного цикла для привязки, когда вкладка снова отображается (либо вручную щелкнув вкладку или программно выбрав вкладку).

Буду признателен за любые предложения.


person Steve    schedule 16.12.2011    source источник
comment
Хороший вопрос. У меня точно такая же проблема с моей панелью вкладок, но когда я попытался подключить метод на стороне сервера (используя поддержку ajax) к методу ontabenter (чтобы выполнить извлечение данных для этой конкретной вкладки), мой метод просто не попал вообще. Он явно не предназначен для такой работы??? Раздражающий.   -  person Lisa    schedule 29.10.2013


Ответы (1)


TabPanel имеет атрибут selectedTab, который вызывает геттер/сеттер каждый раз при выборе вкладки. Вы можете использовать метод установки для обновления данных при выборе определенной вкладки. Вы также можете предотвратить вызов методов получения на каждой вкладке, обернув содержимое вкладки в элемент c:if, который останавливает этот сегмент html, если тест возвращает false. Например:

<ui:composition 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:rich="http://richfaces.org/rich
    xmlns:c="http://java.sun.com/jstl/core">
    <rich:tabPanel selectedTab="#{pageScopedBean.selectedTab}">
        <rich:tab id="particularTab" label="A Tab">
            <c:if test="#{pageScopedBean.selectedTab eq 'particularTab'}">
                <!-- tab contents -->
            </c:if>
        </rich:tab>
    </rich:tabPanel>
</ui:composition>

Затем в Java создайте методы getter и setter для pageScopedBean:

@Name("pageScopedBean")
@Scope(ScopeType.PAGE)
public class PageScopedBean {
    private String selectedTab = "";
    public String getSelectedTab() {
        return selectedTab;
    }
    public void getSelectedTab(String selectedTab) {
        this.selectedTab = selectedTab;
        if (this.selectedTab == "particularTab") {
            // refresh table
        }
    }
person Eric Parshall    schedule 10.01.2012
comment
Я думаю, что ваши предложения будут работать, но они обходные пути для чего-то, что дефектно на панели вкладок RichFaces! - person Lisa; 29.10.2013