2011-06-15 60 views
2

我使用PrimeFaces 2.2.1 Tree組件在Glassfish 3.1PrimeFaces樹選擇空

我試圖在樹中選擇的節點設置爲我支持bean一個TreeNode對象,但它始終是零。

我問PrimeFaces論壇的支持,但不幸收到了沒有答覆。

<p:tree id="contextTree" value="#{contextTreeBean.contextRoot}" var="node" selectionMode="single" selection="#{contextTreeBean.selectedNode}"> 
     <p:treeNode> 
      <h:outputText value="#{node.name}"/> 
     </p:treeNode> 
    </p:tree> 
    <h:outputText id="output" value="#{contextTreeBean.output}"/> 
    <p:commandButton id ="createButton" value="+" actionListener="#{contextTreeBean.createContext()}" update="contextTree, output"/> 


@ManagedBean 
@RequestScoped 
public class contextTreeBean { 

    @EJB 
    private ContextFacadeLocal contextFacade; 
    private Context context = new Context(); 
    private TreeNode contextRoot; 
    private TreeNode selectedNode; 
    private String output; 

    /** Creates a new instance of contextTreeBean */ 
    public contextTreeBean() { 
    } 

    public void createContext() { 
     output = selectedNode.getData().toString(); 
    } 

    public String getOutput() { 
     return output; 
    } 

    public void setOutput(String output) { 
     this.output = output; 
    } 

    public TreeNode getSelectedNode() { 
     return selectedNode; 
    } 

    public void setSelectedNode(TreeNode selectedNode) { 
     this.selectedNode = selectedNode; 
    } 

    public Context getContext() { 
     return context; 
    } 

    public void setContext(Context context) { 
     this.context = context; 
    } 

    public ContextFacadeLocal getContextFacade() { 
     return contextFacade; 
    } 

    public void setContextFacade(ContextFacadeLocal contextFacade) { 
     this.contextFacade = contextFacade; 
    } 

    public TreeNode getContextRoot() { 
     return contextRoot; 
    } 

    public void setContextRoot(TreeNode contextRoot) { 
     this.contextRoot = contextRoot; 
    } 

    @PostConstruct 
    private void postConstruct() { 
     populateContextTree(); 
    } 

    private void populateContextTree() { 
     buildContextTree(new DefaultTreeNode("Root", null), contextFacade.findRootContexts()); 
    } 

    private void buildContextTree(TreeNode parentNode, List<Context> children) { 
     for (Context currentContextNode : children) { 
      TreeNode tempNode = new DefaultTreeNode(currentContextNode, parentNode); 
      buildContextTree(tempNode, currentContextNode.getChildren()); 
     } 
     contextRoot = parentNode; 
    } 
} 
+1

如果您更改bean以查看作用域或會話作用域,它會工作嗎? – 2011-06-15 10:55:52

回答

2

您是否嘗試通過登錄驗證selectedNode爲空?也許它正在設置,但<p:commandButton>update屬性設置不正確。請記住,默認情況下,<h:form>會將其ID標記爲子元素。

也驗證沒有在<h:form>

由其他元素被拋出再者,我不相信,當由@RequestScoped託管bean支持的Primefaces樹組件將正常工作驗證錯誤。嘗試將託管bean更改爲@ViewScoped,以便託管bean的生命週期將跨越各個請求。

+0

我在模板中的表單中有一個JSF模板客戶端中的樹組件。將表單移動到客戶端頁面上工作。我能夠保留後臺bean RequestScoped。應該在模板客戶端中總是有表單組件? – retrodev 2011-06-15 11:29:56

+0

@Laurence,是的,你會發現通常每個客戶端頁面應該至少有一個表單。此外,您可能遇到一些需要多個表單的Primefaces錯誤。一個例子是,如果在單個頁面上有多個對話框組件,最好將每個對話框的內容設置爲單獨的形式。 – 2011-06-15 12:09:34

0

我在JSF模板客戶端中使用了模板中的窗體中的樹組件。將表單移動到客戶端頁面上工作。我能夠保留後臺bean RequestScoped。

+0

那麼,你基本上是嵌套形式? – BalusC 2011-06-16 10:42:35

+0

我在模板中有一個表單,但沒有模板客戶端。我認爲表單會暴露給客戶端頁面,但顯然不是。 – retrodev 2011-06-16 11:01:26