2

そのため、最近、richfaces 4 を使用して JSF ページの作業を開始しました。このページには、rich: collapsiblePanel があります。サーバーから受け取ったリストを繰り返し処理することで collapsiblePanels をレンダリングするrich:dataGrid内で collapsiblePanel を使用しています。パネル ヘッダー (もちろんバッキング Bean) のデータに従って collapsiblePanels を「並べ替える」ためのリンクがあります。collapsiblePanels のいずれかが展開され、並べ替えリンクがクリックされると、それらすべてが展開されますが、1 つが閉じられ、リンクが再度クリックされると、すべてが閉じられます。

私が試したこと:

  • switchType をクライアント以外(つまり、ajax とサーバー)に変更する
  • バッキング Bean に定数ブール値を追加して、リロード時に expand 属性を強制的に false にします (ただし、バッキング Bean の影響はまったく受けません)。

現時点でのサンプルコード:

<h:panelGrid id="SomePanelGrid">
     <rich:dataGrid id="SomeDataGrid" value="bean.listValues" var="values"
         iterationStatusVar="counter" elements="10">

          <rich:collapsiblePanel switchType="client" expanded="#{bean.expanded}">
               Layouts and what not (not in relation to this)
          </rich:collapsiblePanel>
     </rich:dataGrid>
</h:panelGrid>

リンクは、ソートを行うバッキング Bean のメソッドを呼び出すだけです。

私は、dataGrid の代わりに dataTable を含む同様の問題を発見しましたが、答えは与えられていませんが、より多くの行き止まりにつながるリンクのみです。これはhttps://community.jboss.org/message/819938にあります。

どんな助けでも大歓迎です。残念ながら、現時点では他の多くの質問に答える時間があまりありませんが、少し後で確認します.

前もって感謝します。

4

1 に答える 1

0

コード内に多くの構文上の欠陥があります。次のようになります。

<h:panelGrid id="SomePanelGrid">
    <rich:dataGrid id="SomeDataGrid" value="#{bean.listValues}" var="values"
            iterationStatusVar="counter" elements="10">

        <rich:collapsiblePanel switchType="client" expanded="#{bean.expanded}">
            Layouts and what not (not in relation to this)
        </rich:collapsiblePanel>
    </rich:dataGrid>
</h:panelGrid>

あなたの例ではおそらく1 つのcollapsiblePanelしか経験していませんが、このコードは修正およびテストされており、適切に機能します。

AJAX で dataGrid を更新するときに collapsiblePanels の展開状態を保存する場合は、いくつかのものを追加する必要があります。

最初に、パネルの状態を保存するために、反復しているオブジェクトに 1 つのプロパティを追加する必要があります。

public class Item
{
    private boolean expanded;

    public void setExpanded(boolean expanded)
    {
        this.exanded = expanded;
    }

    public boolean getExpanded()
    {
        return this.expanded;
    }

    // Your other stuff
}

次に、Bean にリスナーを追加して、ユーザーがパネルの状態をいつ変更したかを知る必要があります。このパネルに関連する項目を取得する属性に注意してください。

@ManagedBean
@ViewScope
public class Bean
{
    private List<Item> listValues;

    @PostConstruct
    void init()
    {
        listValues = //... Some initialization to your list
    }

    public List<Item> getListValues()
    {
        return this.listValues;
    }

    public void toggle(PanelToggleEvent event)
    {
        // Take the current item
        Item item = (Item)event.getComponent().getAttributes().get("item");

        // Save the current state in the item
        item.setExpanded(event.getExpanded());
    }
}

最後に、リスナーに渡す必要がある属性を忘れずに、AJAX に変更switchTypeし、コードにリスナーを追加する必要があります。

<h:form>
    <rich:dataGrid id="SomeDataGrid" value="#{bean.listValues}" var="item"
            iterationStatusVar="counter" elements="10">

        <rich:collapsiblePanel switchType="ajax" expanded="#{item.expanded}">
            <f:attribute name="item" value="#{item}" />

            Layouts and what not (not in relation to this)
        </rich:collapsiblePanel>
    </rich:dataGrid>
</h:form>
于 2013-06-18T12:59:32.430 に答える