2012-04-27 9 views
3

基本的に私はWicket 1.5を使用して項目とそれに関連する数量を表示したいと考えています。私がこれを戻すために使用しているデータ構造は、Map(新しいHashMap())です。ここで、ItemはPOJであり、その詳細は重要ではありません。本質的に私はwicketのリピーターの1つを使いたいと思いますが、私はListViewを使った経験があります。マップとうまく動作するリピータはありますか?それとも自分でコードを作成する必要がありますか?自分自身をコード化する必要がある場合、上書きするのに最適なクラスは何ですか?Wicket Repeater with backing Map

私はリピータの出力は、本質的のようなものであることを希望:例えばのでItemNameの(ItemNum)

QuantityX

2X:someItem(255609)

マップはユーザーの入力によって変更できますが、私はWicket経由でAJAXを使ってコンポーネントのマークアップをリフレッシュすることに慣れています。あなたの助けが大変ありがとうございます。

+0

これは読み取り専用ですか?地図のキー/値は何ですか? – bert

+1

マップには、フォーム/ ajaxを使用してユーザーが動的に項目と数量を追加しました。キー値はItem-> Quantityで、itemはビジネスオブジェクトを表す私のPOJです。 – thatidiotguy

+1

KeyView(ListViewのモデル)を繰り返し処理して、キーに値を割り当てるのはなぜですか? –

答えて

1

上記のThorstenによって提案されたように、ListViewモデルがMap.Entryを保持していたListViewを使用しました。意図どおりに動作し、Thorstenに感謝します。

0

1つのオプションは、あなただけの数を定義するためにAbstractReadOnlyModelのような整数のモデルを提供するため、一般的に、私は、ものをReapeatするループを好むあなたのListViewコントロールとあなたがArrays.asList(HashMap#values#toArray) のようなマップからretriveことができ、リストでそれを供給を使用することです反復。この場合、どこからでもデータを取得するヘルパーメソッドを自分のモデルに簡単に組み込むことができます。 私は本当にあなた自身のリピータを構築したいと思っています。あなたはAbstractRepeaterを拡張する必要がありますが、むしろループを構築するべきです。

+0

これを説明するために擬似コードを提供できますか?私はあなたが克服しようとしていることについて混乱しています。 – thatidiotguy

0

この記事を参照してください:Wicket Model magic: Map-backed ListView

public CustomFieldsPanel(String id, final IModel<Map<String,ProductCustomField>> fieldMapModel, final FeedbackPanel feedbackPanel) { 

    super(id, fieldMapModel); 
    this.feedbackPanel = feedbackPanel; 

    this.setOutputMarkupId(true); // AJAX JavaScript code needs to have some id="...". 

    IModel<List<ProductCustomField>> listModel = new LoadableDetachableModel() { 
     @Override protected List<ProductCustomField> load() { 
      Map<String,ProductCustomField> map = (Map) CustomFieldsPanel.this.getDefaultModelObject(); 
      return new ArrayList(map.values()); 
     } 
    }; 

    ListView<ProductCustomField> listView; 
    add(listView = new ListView<ProductCustomField>("fieldsRows", listModel){ 
     @Override 
     protected void populateItem(final ListItem<ProductCustomField> item) { 
      item.add(new CustomFieldRowPanel("fieldRow", item.getModel()){ 
       // Delete icon was clicked. 
       @Override 
       protected void onDelete(AjaxRequestTarget target) { 
        Map<String,ProductCustomField> fieldsMap = (Map) CustomFieldsPanel.this.getDefaultModelObject(); 
        fieldsMap.remove(item.getModelObject().getName()); 
        target.add(CustomFieldsPanel.this); // Update UI. 
        try { 
         CustomFieldsPanel.this.onChange(target); // Persists. 
        } catch (Exception ex){ 
         feedbackPanel.error(ex.toString()); 
        } 
       } 
      }); 
     } 
    }); 
    ... 
}