无法在嵌套的Tabviews中展开treetable的节点

时间:2014-02-06 16:38:43

标签: java jsf primefaces

当我在p:treeTablep:tabViewp:tabView作为第二个标签时,我无法展开/折叠节点。但这只发生在这个非常具体的场景中,我已经将其改进为最小代码:

<h:form id="mainForm">
    <p:tabView id="outer" dynamic="false">
        <p:tab id="outer1">
        </p:tab>
        <p:tab id="outer2">
            <p:tabView id="inner" dynamic="false">
                <p:tab id="inner1">
                    <p:treeTable value="#{someBB.root}" var="wrapper">
                        <p:column>
                            #{wrapper}
                        </p:column>
                    </p:treeTable>
                </p:tab>
                <p:tab>
                    <p:tab id="inner2">
                        <p:treeTable value="#{someBB.root}" var="wrapper">
                            <p:column>
                                #{wrapper}
                            </p:column>
                        </p:treeTable>
                    </p:tab>
                </p:tab>
            </p:tabView>
        </p:tab>
    </p:tabView>
</h:form>

该模型也很小:

private TreeNode root;
{
    root = new DefaultTreeNode("root", null);
    TreeNode documents = new DefaultTreeNode("root", root);
    new DefaultTreeNode("node1", documents);
    new DefaultTreeNode("node2", documents);
}

public TreeNode getRoot(){
    return root;
}

所以当我打开页面时,转到outer2选项卡,我无法展开inner1的treeTable中的节点。但是当我切换到inner2时,我可以扩展treeTable中的节点。而更奇怪的是,当我切换回inner1时,我现在也可以在那里扩展节点。如果没有嵌套的Tabview,它也是正确的。

此外,当我删除outer1选项卡时,行为是正确的。

同样共享模型不会影响这个(我尝试为每个treeTable设置不同的模型,但行为是相同的)。

可能有这样的原因,还是PrimeFaces中的错误?

我使用的是Primefaces 4.0

1 个答案:

答案 0 :(得分:0)

有些想法,但你的问题的答案应该在里面......

嗯,首先,你的模型必须在一个范围内,它允许它在请求之间保持其状态,否则你将永远拥有绝对相同的树(在每个请求中树模型“root”将是再次生成)。需要注意的其他重要事项是你必须保持根,你的方法应该是这样的:

private TreeNode root;
{
    if (root != null)
        return root;

    root = new DefaultTreeNode("root", null);
    TreeNode documents = new DefaultTreeNode("root", root);
    new DefaultTreeNode("node1", documents);
    new DefaultTreeNode("node2", documents);
}

public TreeNode getRoot(){
    return root;
}

你必须记住更新正确的树(我认为保持只更新一棵树相当复杂,想象两个!)。最后,但并非最不重要的是,从来没有对两棵树都使用一种模型,你搞乱一切,几乎不可能在这种情况下使事情正常工作。尝试使用两个模型并使树模型(root)保持适当的范围(支持bean中的@ViewScoped或@SessionScoped或CDI bean中的@Session)。

我希望这可以帮到你。