【问题标题】:PrimeFaces <p:tree>: how to save tree state between refreshes?PrimeFaces <p:tree>:如何在刷新之间保存树状态?
【发布时间】:2012-07-06 14:41:35
【问题描述】:

我正在使用 PrimeFaces JSF 库,并且我有一棵树,其中每个节点都是一个复选框:

<p:tree selectionMode="checkbox"...>

这棵树代表一些文件,它每 5 秒动态刷新(轮询)一次,因为可以添加或删除文件/节点:

<p:poll interval="5" update="treeId"... />

用户可以通过树节点复选框选择文件。选定的节点保存在 TreeNode 数组中:

<p:tree selection="#{BackingBean.selectedNodes}"...>

其中 selectedNodes 定义为:

private TreeNode[] selectedNodes;

问题是:由于树不断刷新(每 5 秒),我失去了树状态!用户选中的内容再次变为未选中。

如何在 5 秒刷新之间保持树状态的记忆?

【问题讨论】:

    标签: jsf tree primefaces


    【解决方案1】:

    如果您使用的是 JSF 2:

    制作你的支持豆@ViewScoped:

    @ManagedBean
    @ViewScoped
    public class BackingBean {
        ...
    }
    

    如果您使用的是 JSF 1.2:

    使用来自 Richfaces 的组件 a4j:keepAlive

    <a4j:keepAlive bean="BackingBean" />
    

    您还可以选择使用 Tomahawk's saveState(使用适合您项目的 Tomahawk 版本),仅将 selectedNodes 放在视图中:

    <t:saveState value="#{BackingBean.selectedNodes}" />
    

    只需将 Tomahawk 及其依赖项放在 WEB-INF/lib 中,在 web.xml 中注册过滤器并在 .xhtml 页面上注册命名空间即可。

    【讨论】:

    • 没有。 :-( 当我将 bean 更改为 view scoped 时,我的代码不起作用;我需要做一些重大的更改才能使 vies scoped 工作,现在我没有时间。可能有另一种解决问题的方法吗?跨度>
    • 好吧,您可以尝试使用t:saveState 在视图中仅保存 selectedNodes 的树,我将更新我的答案以说明我的意思。
    • 回到 Tomahawk 真是太糟糕了:我们刚刚丢弃了所有 Tomahawk 依赖项,并从项目中完全删除了 Tomahawk,现在只使用 PrimeFaces。再次链接整个库是否有意义,这一次只是因为这个问题?
    • 我明白了......好吧,如果我是你,我会让它在视图范围内工作。
    • 无法使用 ViewScoped bean,因为它要求所有对象都是可序列化的,而这在我的代码中是不可能的。所以,ViewScoped 绝对不适合我。
    猜你喜欢
    • 2013-01-01
    • 2016-09-08
    • 2016-02-20
    • 1970-01-01
    • 2021-08-08
    • 2011-04-08
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多