2014-11-23 9 views
3

다른 솔루션을 시도했지만 내 경우에는 아무 것도 작동하지 않습니다. 이 datatable의 모든 행을 선택 가능하게하고 싶습니다.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이 성공적으로 표시됩니다 문제는 아마도 개체를 무시하는 <ui:repeat ...

가 내 빈 것 같다 내 페이지에. 그러나 onChatRowSelection 방법 에만 "행운을 빕니다"와 관련된 행을 클릭하면 두 번째 목록에 추가했습니다. 내지도에 objectList2을 추가했습니다. objectList1을 추가 한 첫 번째 목록의 줄을 클릭하면 시스템에 onChatRowSelection 메서드가 입력 될 때 selectedChatObject이 null이됩니다. 이 문제를 어떻게 해결할 수 있습니까?

감사합니다.

답변

3

귀하의 문제는 여기에 있습니다 :

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

여러 데이터 테이블은 자바 스크립트 범위에서 정확히 같은 widgetVar 이름이 할당되어있다. 효과에서 다음 자바 스크립트 코드가 생성됩니다 : 그것은 마지막 하나를 참조 최대 끝날 때까지

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();"> 

다음과 같은 자바 스크립트 코드가 생성이 방법 : 마지막으로

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

그리고 그들 모두를 찾을 수있는 위젯 매니저를 PrimeFaces.

+0

감사합니다 !!! 데이터 테이블에 동적 ID를 넣으려고했으나 가능하지 않았습니다. widgetVar에 대해서는 전혀 생각하지 않았습니다. 오늘 밤 나는 그것을 시험 할 것이다! – qxlab