2012-07-04 3 views
0

저는 교사가 질문을하는 양식을 만들고 있습니다. 질문의 한 유형은 선다형 문제입니다. 양식에는 질문 공식을 작성하는 textArea와 대안에 대해 textFields를 사용하는 listView가 있습니다.Wicket : 텍스트 필드를 다시 칠하고 사용자 입력을 유지합니다.

새 대안을 추가하는 버튼이 있습니다 (새 textField 추가).이 버튼을 누르면 모든 대안을 다시 페인팅하고 새 대안을 추가합니다. 이제 문제는 다음과 같습니다. 이미 텍스트가있는 listView에 텍스트가있는 텍스트를 칠하기 전에 선생님이 작성한 텍스트를 유지하고 싶습니다. 그러나이 방법을 사용하는 방법을 모릅니다 (모든 다시 칠하기 전에 데이터베이스에 값 저장하는 경우 제외). ,하지만 그것은 나쁜 생각처럼 보입니다).

다음은 MultipleChoiceQuestionPanel의 코드입니다. 충분한 것으로 기대됩니다.

public class MultiChoiceQuestionPanel extends QuestionPanel { 

    private List<Alternative> alternatives; 

    @SpringBean 
    private AlternativeRepository alternativeRepository; 

    public List<Alternative> getAlternatives(){ 
     return alternatives; 
    } 

    public MultiChoiceQuestionPanel(String id, MultipleChoiceQuestion q){ 
     super(id, q); 

     final WebMarkupContainer parent = new WebMarkupContainer("alternativesContainer"); 
     parent.setOutputMarkupId(true); 
     add(parent); 
     parent.add(new Label("AnswerLabel", "Svar")); 

     q.setAlternatives(alternativeRepository.findByMultipleChoiceQuestion(q)); 
     alternatives = q.getAlternatives(); 
     Form form = new Form("addForm"); 
     form.add(new ListView<Alternative>("alternatives", alternatives) { 
      @Override 
      protected void populateItem(final ListItem<Alternative> alternativeListItem) { 
       alternativeListItem.add((TextField<String>) new TextField<String>("alternative", new AlternativeModel(alternativeListItem.getModelObject())).setRequired(true).setType(String.class)); 
       Form form = new Form("removeForm"); 
       form.add(new AjaxSubmitLink("remove") { 
        @Override 
        protected void onSubmit(AjaxRequestTarget target, Form<?> form) { 
         Alternative selected = alternativeListItem.getModelObject(); 
         alternativeRepository.delete(selected); 
         getAlternatives().remove(selected); 
         target.addComponent(parent); 
        } 
       }); 
       alternativeListItem.add(form); 
       add(alternativeListItem); 
      } 
     }); 

     AjaxSubmitLink a = new AjaxSubmitLink("add") { 
      @Override 
      protected void onSubmit(AjaxRequestTarget target, Form<?> form) { 
       Alternative alternative = new Alternative(); 
       MultipleChoiceQuestion mcq = (MultipleChoiceQuestion) getQuestion(); 
       alternative.setSequenceNumber(mcq.getAlternatives().size()); 
       alternative.setMultipleChoiceQuestion((MultipleChoiceQuestion) getQuestion()); 
       alternativeRepository.save(alternative); 
       getAlternatives().add(alternative); 
       target.addComponent(parent); 
      } 
     }; 
     a.setDefaultFormProcessing(false); 
     form.add(a); 
     parent.add(form); 
    } 
} 

도움을 주시면 감사하겠습니다. Javadoc of ListView에서

답변

3

:

경고 :이 양식에서 둥지의 ListView, 유효성 검사 작업 제대로을하기 위해 true로 setReuseItems 속성을 설정해야 할 수 있지만. 기본적으로 setReuseItems는 false이며, ListView가 모든 하위 구성 요소를 새 인스턴스로 바꾼다는 효과가 입니다. 아이디어는 항상 신선한 데이터를 렌더링한다는 것과 사람들 은 일반적으로 ListView를 사용하여 읽기 전용 목록 (적어도 우리가 생각하는 것 )을 표시하기 때문에 좋은 기본 동작입니다. 구성 요소가 렌더링이 시작되기 전에 교체로 그들이 다른 인스턴스와 교체로

그러나, 이러한 구성 요소에 대한 특정 메시지에 대한 검색이 실패합니다. 또 다른 문제점은 '잘못된'사용자 입력이 구성 요소의 (임시) 인스턴스 데이터로 유지된다는 것입니다. 이러한 구성 요소가 으로 바뀌므로 setReuseItems가 false 일 때 사용자가 잘못된 데이터를 보지 않습니다.

이것은 본질적으로 발생합니다. ListView에 대해 setReleaseItems를 true로 설정해야합니다.

+0

감사합니다. 문제가 해결되었습니다. –

+0

@LeoSundholm 여러분을 환영합니다. – Nicktar

+0

이것은 새로운 문제를 만든 것으로 보입니다. 새 textFields를 추가해도 완벽하게 작동하지만 제거 버튼이 이상하게 작동합니다. 어떤 버튼을 눌러도 삭제되는 버튼은 사라지는 textField의 마지막 텍스트입니다. 제거한 textField의 텍스트가 아닙니다. 그 이유에 대한 설명이나 제안? –