Primefaces无法更新p:tree

时间:2014-07-13 05:39:12

标签: java jsf jsf-2 primefaces tree

我正在使用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。任何想法为什么它不起作用?

1 个答案:

答案 0 :(得分:0)

由于我无法更好地描述bean范围,而不是已经针对类似问题给出的优秀答案,我只会向您推荐BalusC和Kishor P here的答案。

只有在创建bean时,框架才会调用init方法(或带有@ PostConstruct-annotation的任何方法),在注入之后,因此在构造函数运行之后,如rion18所说。除了初始化工作之外,将该方法用于其他任何事情都是不正常的。因此,创建其他方法,并从actions和actionListeners中调用它们。

如果你想用ajax调用bean(就像你那样),那么它需要至少是ViewScoped。如果你确实想每次都应该使用RequestScoped来调用init(),那么当你用ajax调用它时,bean将是新的,而不记得是什么。