繁体   English   中英

无法在嵌套TabView中展开TreeTable的节点

[英]Cannot expand node of treetable in nested tabviews

当我有一个p:treeTablep:tabView内部p: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;
}

因此,当我打开页面时,转到external2选项卡,我无法在inner1的treeTable中展开该节点。 但是,当我切换到inner2时,我可以扩展该treeTable中的节点。 更奇怪的是,当我切换回inner1时,现在也可以在其中扩展节点。 如果没有嵌套的tabview,那也是正确的。

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

另外,共享模型不会对此产生影响(我尝试为每个treeTable使用不同的模型,但是行为是相同的)。

可能有某些原因吗?还是PrimeFaces中的错误?

我使用Primefaces 4.0

有些想法,但是您问题的答案应该在内部...

好吧,首先,您的模型必须在允许其在请求之间保持其状态的范围内,否则您将始终拥有绝对相同的树(因为在每个请求中,树模型“根”将再次生成) 。 需要注意的另一重要事项是您必须保留根目录,您的方法应如下所示:

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

而且您必须记住要更新正确的树(而且我认为仅更新一棵树是相当复杂的,想象两棵!)。 最后但并非最不重要的一点是,永远不要对两棵树都使用一种模型,因为这会弄乱一切,在这种情况下几乎不可能使事情正常进行。 尝试使用两个模型,并在树模型(根模型)中保留适当的范围(在后备bean中使用@ViewScoped或@SessionScoped或在CDI bean中使用@Session)。

希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM