2014-11-23 62 views
3

我已經嘗試了不同的解決方案,但沒有人在我的情況下工作。我希望這個數據表中的所有行都可以選擇。這個問題似乎是<ui:repeat這可能是壓倒一切的對象...如何使用primefaces選擇數據表迭代一個HashMap

我的豆:

@ManagedBean 
@ViewScoped 
public class Chat { 

    private static Map<String, List<ChatObject>> chat = new LinkedHashMap<String, List<ChatObject>>(); 
    private ChatObject selectedChatObject; 

    public void onChatRowSelection(){ 
     if(getSelectedChatObject() != null){ 
      System.out.println("test"); 
     } 
    } 

    public List<Map.Entry<String, List<ChatObject>>> getChatList() { 
     Set<Map.Entry<String, List<ChatObject>>> productSet = chat.entrySet(); 
     return new ArrayList<Map.Entry<String, List<ChatObject>>>(productSet); 
    } 

    @PostConstruct 
    public void postConstructMethod() { 

     if(chat.isEmpty()){ 

      List<ChatObject> objectsList1 = new ArrayList<ChatObject>(); 
      objectsList1.add(new ChatObject("3369818", "1", "1")); 
      objectsList1.add(new ChatObject("3369819", "2", "2")); 
      objectsList1.add(new ChatObject("3369820", "3", "3")); 

      chat.put("Chat Topic 1", objectsList1); 

      List<ChatObject> objectsList2 = new ArrayList<ChatObject>();   
      objectsList2.add(new ChatObject("3369813", "4", "4")); 
      objectsList2.add(new ChatObject("3369815", "5", "5")); 
      chat.put("Chat Topic 2", objectsList2); 
     } 

    } 

    public ChatObject getSelectedChatObject() { 
     return selectedChatObject; 
    } 

    public void setSelectedChatObject(ChatObject selectedChatObject) { 
     this.selectedChatObject = selectedChatObject; 
    } 
} 

我的JSF:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
    xmlns:h="http://xmlns.jcp.org/jsf/html" 
    xmlns:f="http://xmlns.jcp.org/jsf/core" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"> 

<h:form id="form" enctype="multipart/form-data" acceptcharset="ISO-8859-1"> 

<ui:repeat value="#{chat.chatList}" var="chatEntry"> 

    <h2><h:outputText value="#{chatEntry.key}" /></h2> 
    <br /> 

    <p:dataTable 
     value="#{chatEntry.value}" 
     var="chatEntryVar" 
     widgetVar="chatTableWV" 
     styleClass="geralBorderless" 
     style="cursor:pointer" 
     rowKey="#{chatEntryVar.id}" 
     rendered="true" 
     selectionMode="single" 
     selection="#{chat.selectedChatObject}" 
     paginatorAlwaysVisible="false"> 

     <p:ajax event="rowSelect" 
      listener="#{chat.onChatRowSelection}" 
      oncomplete="chatTableWV.unselectAllRows();"> 

     </p:ajax> 

     <p:column> 
      <h:outputText value="#{chatEntryVar.name}" /> 
     </p:column> 
    </p:dataTable> 

</ui:repeat> 
</h:form> 
</html> 

所有5 ChatObject在我的地圖成功顯示在我的頁面。但onChatRowSelection方法只打印「測試」,當我點擊行有關列表我添加到我的地圖:objectList2當我從第一個列表中點擊行時,我添加了objectList1,當系統進入onChatRowSelection方法時,selectedChatObject將爲空。我怎樣才能解決這個問題?

謝謝!

回答

3

你的問題是在這裏:

<ui:repeat ...> 
    <p:dataTable ... widgetVar="chatTableWV"> 
     <p:ajax ... oncomplete="chatTableWV.unselectAllRows();"> 

多個數據表中的JavaScript範圍被分配完全相同的widgetVar名。在效果,產生下面的JavaScript代碼:

window['chatTableWV'] = new Widget(tableElement1); 
window['chatTableWV'] = new Widget(tableElement2); 
window['chatTableWV'] = new Widget(tableElement3); 
// ... 

基本上,直到它結束了參考上一個每次迭代覆蓋分配給申報widgetVar名字的最後一個對象。所有小部件期望最後一個基本不可用,導致它們不再適用於行選擇。

通過給他們每個獨特的widgetVar來修復它。你可以使用<ui:repeat>的迭代索引。

<ui:repeat ... varStatus="loop"> 
    <p:dataTable ... widgetVar="chatTableWV_#{loop.index}"> 
     <p:ajax ... oncomplete="chatTableWV_#{loop.index}.unselectAllRows();"> 

這種方式產生下面的JavaScript代碼:

window['chatTableWV_0'] = new Widget(tableElement1); 
window['chatTableWV_1'] = new Widget(tableElement2); 
window['chatTableWV_2'] = new Widget(tableElement3); 
// ... 

最後PrimeFaces小插件管理器可以找到他們。

+0

謝謝!我試圖在數據表中放入一個動態ID,但這是不可能的。從來沒有想過widgetVar。今晚我會測試它! – qxlab 2014-11-25 18:19:54

相關問題