我正在使用primefaces 4.0和JSF 2.2,而我目前正在尝试使用p:tree更新表单。 commandButton正常工作但它不更新表单或调用init()方法,直到我手动刷新页面。我不知道自己做错了什么,因为相同的代码适用于DataTable元素。
以下是代码:
<h:form id="preferenciasForm">
<div id="panelTree">
<p:panel id="defTree" style="margin-bottom: 20px">
<p:tree value="#{dtPreferencesBuilder.root}" var="node"
selectionMode="checkbox"
selection="#{dtPreferencesBuilder.selectedNodes}"
style="width:100%; height:100%;" animate="true">
<p:treeNode>
<h:outputText value="#{node.label}" />
</p:treeNode>
</p:tree>
<p:commandButton value="Add preferences"
icon="ui-icon-pencil"
actionListener="#{dtPreferencesBuilder.insertPrefNodes()}"
update=":preferenciasForm" ajax="true" />
</p:panel>
</div>
</h:form>
这里是java类。
@ManagedBean(name="dtPreferencesBuilder")
@ViewScoped //I've tried with or without the ViewScoped, neither work
public class PreferencesBuilderBean {
private TreeNode root;
private TreeNode prefRoot;
private TreeNode[] selectedNodes;
@PostConstruct
public void init() {
System.out.println("Building Tree");
selectedNodes=null;
root=null;
prefRoot=null;
root=getStandardTree();
prefRoot=getPreferedTree();
}
未调用init(),因为print仅在手动重新加载时显示,因此树不会更新,也不会刷新selectedNodes。任何想法为什么它不起作用?
答案 0 :(得分:0)
由于我无法更好地描述bean范围,而不是已经针对类似问题给出的优秀答案,我只会向您推荐BalusC和Kishor P here的答案。
只有在创建bean时,框架才会调用init方法(或带有@ PostConstruct-annotation的任何方法),在注入之后,因此在构造函数运行之后,如rion18所说。除了初始化工作之外,将该方法用于其他任何事情都是不正常的。因此,创建其他方法,并从actions和actionListeners中调用它们。
如果你想用ajax调用bean(就像你那样),那么它需要至少是ViewScoped。如果你确实想每次都应该使用RequestScoped来调用init(),那么当你用ajax调用它时,bean将是新的,而不记得是什么。