3

つまり、基本的にWicket 1.5を使用して、アイテムとそれに関連する数量を表示したいと思います。これを裏付けるために使用しているデータ構造はマップ(new HashMap())であり、ItemはPOJであり、その詳細は重要ではありません。基本的に、ウィケットのリピーターの1つを使用したいのですが、ListViewの使用経験しかありません。マップでうまく機能するリピーターはありますか、それとも自分でコーディングする必要がありますか?自分でコーディングする必要がある場合、オーバーライドするのに最適なクラスは何ですか?

リピーターの出力は、基本的に次のようになります。

数量X:ItemName(ItemNum)

たとえば、次のようになります。

2x:someItem(255609)

マップはユーザー入力によって変更できますが、Wicketを介したAJAXによるコンポーネントのマークアップの更新には精通しています。あなたの助けは大歓迎です。

4

3 に答える 3

1

上記のThorstenが提案したように、ListViewモデルがMap.Entryを保持するListViewを使用することになりました。意図したとおりに動作します。Thorstenに感謝します。

于 2012-05-01T18:34:14.813 に答える
0

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

于 2012-04-28T11:03:08.547 に答える
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() );
                    }
                }
            });
        }
    });
    ...
}
于 2013-01-22T03:40:40.200 に答える