扩展Richfaces可折叠面板的行为

时间:2013-06-18 10:43:36

标签: jsf-2 richfaces

所以,我最近开始使用richfaces 4开发一个JSF页面,其中我有一个 rich:collapsiblePanel 。我遇到了一个问题,我在 rich:dataGrid 中使用了collapsiblePanel,它通过迭代从服务器收到的列表来呈现collapsiblePanel。有一个链接到' sort' collapsiblePanels根据面板标题中的数据(当然在后备bean中)。展开任何collapsiblePanel并单击排序链接时,所有这些都会展开,而所有展开都会展开,如果一个已关闭,再次点击链接,所有链接都会关闭。

我尝试过的事情:

  • 将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中的一个方法来进行排序。

我发现了一个类似的问题,涉及dataTable而不是dataGrid,虽然没有给出答案,但只有链接导致更多的死胡同。可在以下网址找到:https://community.jboss.org/message/819938

非常感谢任何帮助。不幸的是,目前我没有太多时间回答其他问题,但稍后我会回来查看。

提前致谢。

1 个答案:

答案 0 :(得分: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>