【发布时间】:2012-05-22 18:03:11
【问题描述】:
我在 Glassfish 3 上运行 Primefaces 3.2 和 JSF 2.0。
我已经尝试了很多,以编程方式从托管 bean 设置所选节点。这包括像这样设置选定的节点:
public void setSelectedTreeNode(String name) {
TreeNode root = treeBean.getRoot();
List<TreeNode> tree = root.getChildren();
for(TreeNode node:tree) {
if(node.getData().toString().contains(name)) {
System.out.println("found the node to select");
treeBean.setSelectedNode(node);
break;
}
}
RequestContext context = RequestContext.getCurrentInstance();
context.update(":navForm:treeSingle");
}
在终端打印“找到要选择的节点”,但在网页的树中没有选择节点..
树是这样的:
<h:form id="navForm">
<p:tree id="treeSingle" value="#{treeBean.root}" var="node"
selectionMode="single" styleClass="treeStyle"
selection="#{treeBean.selectedNode}"
cache="false"
>
<p:ajax event="select" listener="#{treeBean.onNodeSelect}" update=":mainForm" />
<p:treeNode>
<h:outputText value="#{node}" escape="false" />
</p:treeNode>
编辑:TreeBean 是这样构建的:
@ManagedBean
@SessionScoped
public class TreeBean implements Serializable {
private TreeNode root;
private TreeNode selectedNode;
public TreeBean() {
root = new DefaultTreeNode("Root", null);
TreeNode node0 = new DefaultTreeNode("Node 0", root);
TreeNode node1 = new DefaultTreeNode("Node 1", root);
TreeNode node2 = new DefaultTreeNode("Node 2", root);
TreeNode node00 = new DefaultTreeNode("Node 0.0", node0);
TreeNode node01 = new DefaultTreeNode("Node 0.1", node0);
TreeNode node10 = new DefaultTreeNode("Node 1.0", node1);
TreeNode node11 = new DefaultTreeNode("Node 1.1", node1);
TreeNode node000 = new DefaultTreeNode("Node 0.0.0", node00);
TreeNode node001 = new DefaultTreeNode("Node 0.0.1", node00);
TreeNode node010 = new DefaultTreeNode("Node 0.1.0", node01);
TreeNode node100 = new DefaultTreeNode("Node 1.0.0", node10);
}
public TreeNode getRoot() {
return root;
}
public TreeNode getSelectedNode() {
return selectedNode;
}
public void setSelectedNode(TreeNode selectedNode) {
this.selectedNode = selectedNode;
}
}
有人知道怎么做吗?
【问题讨论】:
-
treeBean.setSelectedNode(node) 是做什么的?你能显示那个方法的代码吗?
-
用 TreeBean 更新了问题。它基本上只是一个普通的二传手。像这样构建:primefaces.org/showcase/ui/treeSelectionSingle.jsf
-
好的。方法 setSelectedTreeNode 在另一个 bean 中,对吗? bean 的范围是什么?您是否使用 ManagedProperty 进行注入?您确定注入的 treeBean 与页面使用的 treeBean 相同吗? (可能正在创建一个新实例)
-
其实是一个有趣的问题。 bean 是 SessionScoped,但我正在编辑从 JSF 1.1 升级到 JSF 2.0 的旧应用程序,因此我使用的是旧的 FacesContext facesContext = FacesContext.getCurrentInstance(); VariableResolver vr = facesContext.getApplication().getVariableResolver(); TreeBean treeBean = (TreeBean) vr.resolveVariable(facesContext, "TreeBean");而不是注射。也许那里有什么..
-
我建议您调试或添加一些日志记录以确定是否正在使用相同的实例。也许使用您的代码创建了一个新实例。您也可以尝试使用 @ManagedProperty(value="#{treeBean}" 而不是 JSF 1.1 代码
标签: jsf primefaces