Получатели Rich TabPanel вызываются, когда содержимое вкладки не отображается - PullRequest
3 голосов
/ 16 декабря 2011

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

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

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

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

Должен быть способ обойти это короткое замыкание - вытащить весь контент из TabPanel в RichFace и развернуть мое собственное.

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

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

1 Ответ

1 голос
/ 11 января 2012

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
        }
    }
...