簡體   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