2015-11-26 22 views
0

我有3個實體 - 市場,主題和項目。市場是項目父項目的主題。我希望找到一個簡單的方法來調用一個動作,方法是從最終的子節點(項目)中選擇一個值並將其帶到可以查看所選項目的頁面。該JSF:Primefaces樹以及如何基於TreeNode葉實體ID導航

<p:tree value="#{treeTestBean.treeTest}" var="tree" 
         dynamic="true" 
         selectionMode="single" 
         selection="#{treeTestBean.selectednode}"> 

        <p:ajax event="select" listener="#{treeTestBean.onNodeSelect}"/> 
        <p:treeNode> 
         <h:outputText value="#{tree}"/> 
        </p:treeNode> 
    </p:tree> 

託管bean:

@Named(value = "treeTestBean") 
@SessionScoped 
public class TreeTestBean implements Serializable { 

private TreeNode treetest; 
private TreeNode selectednode; 
private TreeNode node0; 
private TreeNode node1; 
private TreeNode node2; 

private List<Enmarkets> markList; 
private List<Entopic> topList; 
private ListDataModel<Enitem> itList; 

private Enitem selItem; 

public TreeNode getTreeTest() { 
    treetest = new DefaultTreeNode("Root", null); 
    markList = rootFacade.findAll(); 

    for (Enmarkets m : markList) { 

     node0 = new DefaultTreeNode(m.getMarketname(), treetest); 
     int marketid = m.getMarketid(); 
     topList = topfac.marketTopNorm(marketid); 

     for (Entopic t : topList) { 
      node1 = new DefaultTreeNode(t.getTopicname(), node0); 
      int topicid = t.getTopicid(); 
      itList = itfac.itemFroTopic(topicid); 

      for (Enitem i : itList) { 
       node2 = new DefaultTreeNode(i.getItemname(), node1); 
      } 

     } 
    } 

    return treetest; 
} 

在AJAX使用的onNodeSelect方法也是在託管bean。如果選擇的節點是葉它將搜索項目的名稱,並返回,在導航頁:

public void onNodeSelect(NodeSelectEvent event) { 
this.setSelectednode(event.getTreeNode()); 

String somekey = selectednode.getRowKey(); 

if(selectednode.isLeaf()){ 
    String itemName = selectednode.getData().toString(); 

// Standard JPA call to search for item name here (omitted because this is not how i want to do it) 

    FacesContext 
      .getCurrentInstance() 
      .getApplication() 
      .getNavigationHandler() 
      .handleNavigation(FacesContext.getCurrentInstance(), null, "/Main/Starter.xhtml?faces-redirect=true"); 
} 
else { 
    doNothing(); 
} 
} 

onNodeSelect應該搜索的項目名稱和導航到該頁面與所選項目的細節。上述方法通過搜索項目名稱字符串並將其與匹配到持久層創建的項目實體值列表中的名稱來完成。這將允許將selectednode字符串與正確的項目名稱相匹配,以便導航的jsf頁面填充實體詳細信息(例如使用標準的h:outputText標記)。出於以下幾個原因,我更願意根據實體ID而不是字符串進行搜索。

+1

你其實***讀*** rowkey(但從來沒有使用它!!!),爲什麼不***也設置***它與實體ID? (你看過[(Default)TreeNode](https://github.com/primefaces/primefaces/blob/master/src/main/java/org/primefaces/model/DefaultTreeNode.java)的api嗎?) – Kukeltje

+0

謝謝 - 非常有幫助!不,我沒有看到你提供的api。我看到的是:http://www.primefaces.org/docs/api/5.0/org/primefaces/model/DefaultTreeNode.html它沒有提供很多信息在所有。我錯誤地認爲rowkey鏈接到實體。我將研究如何使用實體ID設置rowkey。 –

+1

我認爲你也可以把實體放在那裏,併爲顯示實現一個toString(),但我不確定 – Kukeltje

回答

0

Kukeltje的評論大大幫助我朝着正確的方向發展。第一I包括一個地圖創建的葉節點時(字符串,整數):

for (Enitem i : itList) { 
node2 = new DefaultTreeNode(i.getItemname(), node1); 
String rowK = node2.getRowKey(); 
int itid = i.getItemid(); 
rowMap.put(rowK, itid); 

然後,在onNodeSelect方法我使用此映射到selectednode的rowKey匹配到相應的實體ID:

public void onNodeSelect(NodeSelectEvent event) { 

if(selectednode.isLeaf()){ 
String rKey = selectednode.getRowKey(); 
if(rowMap.containsKey(rKey)) { 
String xKey = rowMap.get(rKey).toString(); 
Integer rKeyint = Integer.parseInt(xKey); 
selItem = itfac.find(rKeyint); 

FacesContext 
.getCurrentInstance() 
.getApplication() 
.getNavigationHandler() 
.handleNavigation(FacesContext.getCurrentInstance(), null, "/Main/Client/ItemDetails.xhtml?faces-redirect=true"); 

    } 
} 
else { 
doNothing(); 
} 

這導航到顯示所選節點葉的詳細信息的頁面。我懷疑這樣做可能會更容易或更有效,並會歡迎任何意見。就像,我不知道是否真的有必要將字符串轉換爲整數轉換,而我並沒有通過更簡單的方式進行思考。

現在,這似乎解決了我的具體問題。謝謝