2012-12-01 2 views
4

내 primefaces pickList 소스 및 대상 값이 변경되지 않았으므로 primefaces showcase 의 예제를 따라 갔지만 여기에도 여러 게시물을 보았지만 여전히 문제를 해결할 수는 없습니다.Primefaces picklist 대상 및 소스 값이 변경되지 않음

private DualListModel<Course> courseModel; 
public CourseBean() { 
    List<Course> target = new ArrayList<Course>(); 
    List<Course> source = new ArrayList<Course>(); 
    courseModel = new DualListModel<Course>(source, target); 
} 
... 
//this DualListModel getter also populates the source with values from db 
public DualListModel<Course> getCourseModel() { 
    courseModel.setSource(getCourseList()); 
    return courseModel; 
} 

내 컨버터가

import org.omnifaces.converter.SelectItemsConverter; 

@FacesConverter("courseConverter") 
public class CourseConverter extends SelectItemsConverter { 
@Override 
public String getAsString(FacesContext context, UIComponent component, 
     Object value) { 
    Integer id = (value instanceof Course) ? ((Course) value).getId() 
      : null; 
    return (id != null) ? String.valueOf(id) : null; 
} 
@Override 
public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) { 
    Course course = new Course(); 
    course.setId(Integer.parseInt(value)); 
    return course; 
} 
} 

이고, 결국 내 XHTML의 페이지는 다음과 같습니다 :

<h:form> 
    <p:pickList id="coursesOffered" 
     value="#{courseView.courseModel}" var="course" 
     itemValue="#{course}" itemLabel="#{course.courseTitle}" 
     converter="courseConverter" showSourceFilter="true" 
     showTargetFilter="true" filterMatchMode="contains"> 

     <f:facet name="targetCaption">Selected</f:facet> 
     <f:facet name="sourceCaption">All Courses</f:facet> 

     <p:ajax event="transfer" listener="#{courseView.onTransfer}" /> 

     <p:column style="width:10%"> 
     #{course.courseCode}: 
    </p:column> 
     <p:column style="width:90%"> 
     #{course.courseTitle} 
    </p:column> 

    </p:pickList> 

    <p:commandButton id="pojoSubmit" value="Submit" 
     update="displayPlayers" oncomplete="playerDialog.show()" 
     style="margin-top:5px" /> 

    <p:dialog showEffect="fade" hideEffect="fade" widgetVar="playerDialog"> 
     <h:panelGrid id="displayPlayers" columns="2"> 

      <h:outputText value="Source: " style="font-weight:bold" /> 
      <ui:repeat value="#{courseView.courseModel.source}" 
       var="course"> 
       <h:outputText value="#{course.courseTitle}" 
        style="margin-right:5px" /> 
      </ui:repeat> 

      <h:outputText value="Target: " style="font-weight:bold" /> 
      <ui:repeat value="#{courseView.courseModel.target}" 
       var="course"> 
       <h:outputText value="#{course.courseTitle}" 
        style="margin-right:5px" /> 
      </ui:repeat> 

     </h:panelGrid> 
    </p:dialog> 
</h:form> 

이 선택 목록이 표시 나는 다음과 같이 소스를 채우기 위해 데이터베이스에서 목록을 사용하고 있습니다 그러나 데이터베이스의 값으로 채워지는 원본을 사용하면 올바르게 작동하지만 단추를 클릭하면 interf에서 항목을 전송 한 후에도 원본 소스 목록 값과 빈 대상 목록 만 표시됩니다 에이스. 내가 뭘 놓치고 있니?

+0

이것은 구체적인 문제의 원인이 아니지만 실제로는 'SelectItemsConverter'를 사용하는 올바른 방법이 아닙니다. 'getAsObject()'를 오버라이드해서는 안됩니다. – BalusC

답변

5

코드에 몇 가지 문제점이 있습니다. getter에서는 데이터베이스에서 DualList를 재구성하여 지금까지 수행 한 모든 변경 사항을 재설정합니다.

public DualListModel<Course> getCourseModel() { 
    return this.courseModel; 
} 

구성 및 방법 주석 @PostConstruct보다는 생성자 + 게터의 데이터베이스에서 목록을로드 :

은이 같은 것을 게터 시도해보십시오.

public void setCourseModel(DualListModel<Course> courseModel) { 
    this.courseModel = courseModel; 
} 

:

public CourseBean() {} 

@PostConstruct 
public void init() { 
    List<Course> target = new ArrayList<Course>(); 
    courseModel.setSource(getCourseList()); 
    courseModel = new DualListModel<Course>(source, target); 
} 

또한 마지막으로 당신은 또한 세터가 필요 여러분의 빈 @ViewScoped 주석, 그래서 당신은 모든 요청

@ManagedBean(name="courseView") 
@ViewScoped 
public class CourseBean { 

} 

에 빈 대상 목록으로 새 콩을 구성 해달라고 나는 정말로 변환기를 들여다 보지 않았다. 필자가 마지막으로 픽리스트를 만들었을 때 나는 프라임 쇼케이스에 포함 된 컨버터를 사용했다. (절대 시도하지 않았다.) 다음은 출처에 대한 링크입니다. http://code.google.com/p/ind/source/browse/indicadorCensoJSF/src/ve/gob/ine/censo/beans/convert/PrimeFacesPickListConverter.java?spec=svn154&r=154

+0

도움이 답변에 대한 감사 Aksel, 나는 또한 primefaces 쇼케이스 변환기를 구현하고 그것은 매력처럼 일했습니다! – Silverfish

+0

'init()'메소드에서, 메소드 리턴 타입을 'void'로 설정하는 것을 잊었습니다. 이것은 생성자가 아닙니다. –

관련 문제