2017-11-24 28 views
0

dataTable에서 하나의 그룹을 선택하면 해당 사용자를 pickList에 표시하려고합니다. pickList 내에서 일부 사용자를 이동할 때 값을 제출하기 전이나 dataTable의 선택이 변경되기 전에 이러한 새 값을 bean 객체에 저장하려고합니다.Primefaces picklist 소스 및 대상이 업데이트되지 않았습니다.

소스 pickList에서 대상 pickList로 (또는 그 반대로) 사용자를 이동 한 다음 dataTable에서 선택을 변경하면 pickList 소스 및 대상 값은 채워졌을 때와 동일하게 유지됩니다.

User.java

package com.test.model; 

public class User { 
    private String userName; 

    public User(String userName) { 
     this.userName = userName; 
    } 

    public String getUserName() { 
     return userName; 
    } 

    public void setUserName(String userName) { 
     this.userName = userName; 
    } 
} 

Group.java

package com.test.model; 

import java.util.List; 

public class Group { 
    private String groupName; 
    private List<User> users; 

    public Group(String groupName, List<User> users) { 
     this.groupName = groupName; 
     this.users = users; 
    } 

    public String getGroupName() { 
     return groupName; 
    } 

    public void setGroupName(String groupName) { 
     this.groupName = groupName; 
    } 

    public List<User> getUsers() { 
     return users; 
    } 

    public void setUsers(List<User> users) { 
     this.users = users; 
    } 
} 

UserBean.java

package com.test.beans; 

import java.util.ArrayList; 
import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 

import com.test.model.Group; 
import com.test.model.User; 
import org.primefaces.model.DualListModel; 

@ManagedBean 
@ViewScoped 
public class UserBean { 
    private List<Group> groups = new ArrayList<>(); 
    private List<User> allUsers = new ArrayList<>(); 
    private Group selectedGroup; 
    private DualListModel<User> users = new DualListModel<>(); 

    public List<Group> getGroups() { 
     return groups; 
    } 

    public Group getSelectedGroup() { 
     return selectedGroup; 
    } 

    public void setSelectedGroup(Group selectedGroup) { 
     this.selectedGroup = selectedGroup; 
    } 

    public DualListModel<User> getUsers() { 
     return users; 
    } 

    public void setUsers(DualListModel<User> users) { 
     this.users = users; 
    } 

    @PostConstruct 
    private void init() { 
     List<User> usersGroup1 = new ArrayList<>(); 
     usersGroup1.add(new User("User1")); 
     usersGroup1.add(new User("User2")); 

     List<User> usersGroup2 = new ArrayList<>(); 
     usersGroup2.add(new User("User3")); 
     usersGroup2.add(new User("User4")); 

     allUsers.addAll(usersGroup1); 
     allUsers.addAll(usersGroup2); 

     groups.add(new Group("Group1", usersGroup1)); 
     groups.add(new Group("Group2", usersGroup2)); 
    } 

    public void onRowSelect() { 
     // here I want to save the picklist source, but it is already reset 
     List<User> storeUsers = users.getSource(); 
     fillPickList(); 
    } 

    private void fillPickList() { 
     List<User> assignedUsers = new ArrayList<>(); 
     List<User> availableUsers = new ArrayList<>(); 

     assignedUsers.addAll(selectedGroup.getUsers()); 
     availableUsers.addAll(allUsers); 

     for (User user : assignedUsers) { 
      if (availableUsers.contains(user)) 
       availableUsers.remove(user); 
     } 

     users.setSource(assignedUsers); 
     users.setTarget(availableUsers); 
    } 
} 

index.xhtml

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:p="http://primefaces.org/ui"> 

<h:head> 
    <link rel="shortcut icon" type="image/x-icon" href="#{resource['images/favicon.ico']}"/> 
</h:head> 

<h:body> 
    <h:form> 
     <p:dataTable value="#{userBean.groups}" 
        var="group" 
        selectionMode="single" 
        selection="#{userBean.selectedGroup}" 
        rowKey="#{group.groupName}"> 
      <p:column headerText="Groups"> 
       <h:outputText value="#{group.groupName}"/> 
      </p:column> 
      <p:ajax event="rowSelect" 
        listener="#{userBean.onRowSelect}" 
        update="@form"/> 
     </p:dataTable> 

     <p:pickList value="#{userBean.users}" 
        var="user" 
        itemLabel="#{user.userName}" 
        itemValue="#{user.userName}"/> 
    </h:form> 
</h:body> 
</html> 
+0

개발 모드에서 응용 프로그램을 실행하고 오류가 있는지 확인하십시오. ** ** 항상 ** 문제가 ** 발생할 수있는 부분을 결정하는 데 도움이되는 [mcve]를 만듭니다. 이제 보이지 않는 많은 원인이있을 수 있습니다. 그리고 '추측'또는 여러 질문에 대한 자세한 내용을 묻는 것은 너무 많은 시간입니다. – Kukeltje

+0

질문을 이해할 수 없습니다. "값을 제출하기 전에도 bean의 객체에 저장되는 새로운 값을 원합니다."- 무엇? 서버에 값을 보내지 않고 서버에 값만 표시하고 싶습니까? –

+0

여러 그룹의 사용자를 수정 한 다음이 변경 사항을 모두 저장하려고합니다. – Lopfest

답변

0

Map<Group, Set<User>>을 생성 한 다음이 오브젝트로 작업하고 public void onTransfer(TransferEvent event) 메소드를 통해 각 항목 전송시이를 업데이트하여 해결했습니다.

그러나 나는 동적으로 업데이트되지 않는 경우에도 getSource()getTarget() 방법이 무엇인지 이해하지 못합니다.

+0

사물을 변경하면 선택 목록 데이터를 서버로 보내지 않습니다. 아약스도 사용하십시오. 아니면 ** ** picklist에서 picklist를 처리하지 않습니다 : //stackoverflow.com/questions/25339056/understanding-primefaces-process-update-and-jsf-fajax-execute-render-attributes. 차이를 만들 수 있습니다. – Kukeltje