2011-04-22 1 views
1

저는 아주 기본적인 Wicket 문제로 고심하고 있습니다. 백엔드 데이터베이스를 쿼리하려고하지만 결과를 표시 할 수 없습니다. 아래 코드는 제가 사용하고있는 코드입니다. currentQuerycurrentResult은 제출 후 올바르게 업데이트되지만 SearchResults 클래스는 currentResults의 새 데이터로 결코 다시 렌더링되지 않습니다. 나는 결과 클래스가 실제로 모델이 실제로 업데이트되었음을 ​​알지 못한다고 생각한다. 나는 modelChanged를 실험 해 왔지만 작동시키지 못한다. 나는 Wicket에 조금 새로운 것이므로, 나는 완전히 근본적으로 잘못된 것을하고있을 것입니다. 어떤 도움을 많이 주시면 감사하겠습니다!Wicket에서 양식 제출 후 내 결과가 상쾌하지 않은 이유는 무엇입니까?

public class SearchPage extends WebPage { 

Query currentQuery = new Query(); 
Result currentResult = new Result(); 

public SearchPage() { 
    add(new SearchForm("searchForm", new CompoundPropertyModel<Query>(currentQuery))); 
    add(new SearchResults("searchResults", new PropertyModel<List<Hit>>(currentResult, "hits"))); 
} 

public void doSearch(Query Query) { 
    currentResult = getResults(query); 
} 

public class SearchForm extends Form<Query> { 
    public SearchForm(String id, CompoundPropertyModel<Query> model) { 
     super(id, model); 
     add(new TextField<String>("query")); 
    } 

    protected void onSubmit() { 
     super.onSubmit(); 
     doSearch(currentQuery); 
    } 
} 
public class SearchResults extends WebMarkupContainer { 
    public SearchResults(String id, PropertyModel<List<Hit>> model) { 
     super(id, model); 
     add(new ListView<Hit>("hit", model) { 
      protected void populateItem(ListItem<Hit> item) { 
       item.add(new Label("column", item.getModelObject().getColumnValue("column"))); 
      } 
     }); 
    } 
} 

} 
+0

ListView를 사용했기 때문에 그렇게 생각합니다. RefreshingView를 대신 사용해보십시오. – bert

+0

Bert에 감사드립니다.RefreshingView를 시도해 본 적이 없지만 (이 경우에는 내 자신의 반복자를 재정의하고 구현해야만하는 것처럼 보입니다) 다른 해결책을 찾았습니다. 아래를 참조하십시오. – Marcus

답변

1

PropertyModel은 리플렉션을 사용하여 지정된 대상 객체 인스턴스에서 명명 된 속성을 조회합니다. PropertyModel을 생성 할 때 SearchPage의 생성자에서 Result의 특정 인스턴스 (예 : new Result())를 전달했습니다. PropertyModel은이 페이지의 렌더링을 위해 render에서 동일한 Result 인스턴스에 대한 참조를 계속 보유하고 결과를 마지막으로 직렬화 한 다음 각 새 요청주기 (페이지 뷰)가 시작될 때 Result를 deserialize합니다. 나중에 페이지의 currentResult 변수를 다른 Result 인스턴스를 참조하도록 변경하더라도 PropertyModel이 모델 값을 조회하는 데 사용하는 Result 인스턴스에는 영향을주지 않습니다. PropertyModel은 나중에 currentResult을 참조하지 않습니다.

내 머리 꼭대기에서 생각할 수있는 두 가지 해결책이 있습니다.

: 사이클/페이지 뷰 요청에 따라 한 번 hits를로드

new PropertyModel<List<Hit>>(SearchPage.this, "currentResult.hits") 
  • 가 LoadableDetachableModel를 사용

    1. 는 PropertyModel는 페이지의 currentResult 변수의 실제 전류 값에서 hits를 읽고

      new LoadableDetachableModel<List<Hit>>() 
      { 
          protected Object load() 
          { 
           return getResults(currentQuery); 
          } 
      } 
      

    요청주기가 끝나면 LoadableDetachableModel을 분리해야하며 그렇지 않으면 다시 getObject()을 호출하여 List<Hit>을 다시 계산하지 않습니다. 즉, 코드에서 SearchResults 구성 요소의 기본 모델로 사용한다는 것을 보여 주므로 SearchResults 구성 요소는 요청주기의 끝에서 자동으로 모델을 분리합니다.

  • +0

    이것은 매우 도움이되었습니다. 아래의 답변 대신 올바른 답변으로 표시하고 있습니다. 1) 작동하며 2) 이유를 설명합니다. 감사! – Marcus

    0

    나는 그것을 얻었다.

    add(new SearchResults("searchResults", new PropertyModel<List<Hit>>(currentResult, "hits"))); 
    

    PropertyModel의 유형, 즉 List<Hit>, 틀림 모델이 정적 만들기 :이 문제가되는 줄 것으로 보인다. 따라서 지금까지 보았던 유일한 데이터 SearchResults은 초기 개체였으며 비어있었습니다.

    줄을 아래로 변경하고 이에 따라 SearchResult을 업데이트했습니다.

    add(new SearchResults("searchResults", new Model<Result>(currentResult, "hits"))); 
    

    누군가가이를 더 설명하거나 잘못되었다고 생각한다면 의견을 말하십시오. 어쨌든, 나는이 문제를 해결 한 것처럼 내 자신의 답을 정확하게 표시하고있다.

    +0

    'List '의 구현 중 하나를 직접 사용한다면'List'가'Serializable'이 아니기 때문에 그 것이라고 생각합니다. 'ArrayList' 나는 그것이 효과가있을 것이라고 생각합니다. – Tnem