2014-11-23 61 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

相关问题