3

RichFace の (3.3.3) TabPanel について質問があります。TabPanel を使用した 2 つのプロジェクトに取り組みました。各プロジェクトで、表示されていないタブにあるコンポーネントでまだ「getter」メソッドが呼び出されていることに気付きました。

たとえば、最初のタブにはデータテーブルがあり、他のタブ (ajax リクエストを含む) からリクエストが行われるときはいつでも、最初のタブのデータテーブルにバインドされている Bean のゲッターが呼び出されます。

コンポーネントがまだコンポーネント階層にあるため、(タブが現在UIにレンダリングされていなくても)これが発生すると思いますか? つまり、すべてのコンポーネントは親タブ パネルの子であるため、表示されていなくても、要求ごとに処理されます。

わかりました...私の仮定が正しい場合、使用されていないタブに対してデータ取得ロジックが呼び出されないようにする方法が必要です。ゲッターは何度も呼び出される可能性があるため、データの遅延読み込み (ゲッターにデータ取得ロジックを配置しない) に関する投稿を読みました。私はそれを守るために最善を尽くしています。私が見ている問題は、リクエストスコープで定義されたテーブル(タブ1)にバインドされたBeanがあり、ゲッターがテーブルのデータを遅延ロードしているにもかかわらず、Beanがインスタンス化され、データが他のタブからの ajax リクエストごとに (遅延して) プルされます。

RichFace の TabPanel からすべてのコンテンツを引き出して、独自のコンテンツを作成する方法を回避する方法が必要です。

テーブルセッションスコープにバインドされたBeanを作成し、ゲッターがテーブルに返すデータを「キャッシュ」しようとしましたが、問題は、タブが再びレンダリングされたときにバインドするライフサイクルメソッドがないことです(手動でタブをクリックするか、プログラムでタブを選択します)。

提案をいただければ幸いです。

4

1 に答える 1

1

tabPanelには、タブが選択されるたびにゲッター/セッターを呼び出すselectedTabという属性があります。特定のタブが選択されたときに、setterメソッドを使用してデータを更新できます。また、タブのコンテンツをac:if要素でラップすることにより、各タブ内でgetterメソッドが呼び出されないようにすることもできます。これにより、テストでfalseが返された場合にhtmlのそのセグメントが停止します。例えば:

<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内で、pageScopedBeanにgetterメソッドとsetterメソッドを作成します。

@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
        }
    }
于 2012-01-10T22:31:41.797 に答える