2

因此,我最近开始使用 Richfaces 4 处理 JSF 页面,其中有一个rich:collapsiblePanel。但是我遇到了一个问题,我在rich:dataGrid中使用 collapsiblePanel ,它通过迭代从服务器接收到的列表来呈现 collapsiblePanels。有一个链接可以根据面板标题中的数据(当然在支持 bean 中)对 collapsiblePanels 进行“排序”。当任何一个 collapsiblePanel 被展开,并且单击排序链接时,它们都被展开,而所有被展开,如果一个被关闭,并且再次单击链接,它们都被关闭。

我尝试过的事情:

  • 将 switchType 更改为客户端以外的任何其他类型(即 ajax 和服务器)
  • 在支持 bean 中添加一个常量布尔值,以在重新加载时强制扩展属性为 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 中的一个方法来进行排序。

我发现了一个类似的问题,涉及dataTable而不是dataGrid,虽然没有给出答案,但只有导致更多死胡同的链接。这可以在以下位置找到: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>

在您的示例中,您可能只遇到了一个collapsiblePanel,此代码经过修改和测试可以正常工作。

现在,如果您想在通过 AJAX 刷新 dataGrid 时保存 collapsiblePanels 展开状态,则需要添加一些东西。

首先,您需要向正在迭代的对象添加一个属性,以保存每个面板的状态。

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());
    }
}

最后,您需要将您的更改switchType为 AJAX 并在代码中添加侦听器,而不要忘记需要在侦听器中传递的属性。

<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 回答