2011-04-22 124 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。改爲嘗試刷新視圖。 – bert 2011-04-22 19:14:51

+0

感謝您評論Bert!我從來沒有嘗試刷新視圖(看起來像我將不得不重寫和實現我自己的迭代器在這種情況下),但找到了另一種解決方案。見下文。 – Marcus 2011-04-23 09:51:37

回答

1

PropertyModel使用反射來查找給定目標對象實例上的命名屬性。當您構建PropertyModel時,您向它傳遞了一個特定的結果實例,即SearchPage的構造函數中的new Result()。 PropertyModel將繼續保持對從渲染到該頁面呈現的相同Result實例的引用,在最後序列化結果,然後在每個新請求週期(頁面視圖)開始時對結果進行反序列化。事實上,稍後更改頁面的currentResult變量以引用不同的Result實例不影響PropertyModel使用哪個Result實例查找其模型值。您的PropertyModel不在乎以後提到的currentResult

有兩種可能的解決方案,我可以從頭頂上想到。

  1. 有PropertyModel從頁面的currentResult變量的實際電流值閱讀hits

    new PropertyModel<List<Hit>>(SearchPage.this, "currentResult.hits") 
    
  2. 使用LoadableDetachableModel加載hits每請求週期/頁面瀏覽一次:

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

請注意,LoadableDetachableModel必須在請求週期結束時分離,否則將不會再呼叫getObject()重新計算List<Hit>。也就是說,由於您的代碼顯示您將使用它作爲SearchResults組件的默認模型,因此SearchResults組件會在請求週期結束時自動爲您分離模型。

+0

這是非常有幫助的,我把這個標記爲正確的答案,而不是我的答案,下面是1)它的工作原理,2)提供瞭解釋原因。謝謝! – Marcus 2011-04-25 20:32:59

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'不是'Serializable',如果你直接使用了'List'的一個實現, 'ArrayList'我認爲它會工作。 – Tnem 2011-04-24 09:18:30

相關問題