当我在p:treeTable
内p: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;
}
所以当我打开页面时,转到outer2选项卡,我无法展开inner1的treeTable中的节点。但是当我切换到inner2时,我可以扩展treeTable中的节点。而更奇怪的是,当我切换回inner1时,我现在也可以在那里扩展节点。如果没有嵌套的Tabview,它也是正确的。
此外,当我删除outer1选项卡时,行为是正确的。
同样共享模型不会影响这个(我尝试为每个treeTable设置不同的模型,但行为是相同的)。
可能有这样的原因,还是PrimeFaces中的错误?
我使用的是Primefaces 4.0
答案 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)。
我希望这可以帮到你。