2011-11-10 11 views
1

私はWicket DefaultDataTableを使用しています。ユーザーに値を入力するためのテキストフィールドがいくつか含まれています。テーブルはフォーム内にあります。私がフォームを提出するとき、私はそれらを反復することができるように、すべての "行"を取得したい。私はAJAXを使いたくありません。Wicketデータテーブルからすべてのモデルオブジェクトを取得する方法

テーブルを「連絡先」オブジェクトにバインドすることができました。EditablePropertyColumnは、適切なフィールドと入力ボックスを必要な列に表示します。

行アイテムを保持するにはどうすればよいですか? dataTable.getDefaultModelObject()は、フォームが送信されるときにnullを返します。

+1

フォームコードを表示できますか? –

答えて

2

送信されたデータは、Contactオブジェクトに入力されます。これがPropertyColumnの仕組みです。

+0

ありがとう、それは私の質問に答えることはできません:datatable thatsフォーム(つまり、datatableリストcontactobjectのリスト)を追加することができますどのようにdatatableの行を取得し、それらを介してonsubmitボタンを繰り返しますか? – Jojaman

+0

は、 "データ送信可能な行を取得して、フォーム送信ボタンを押したときにonsubmitオーバーライドでそれらを反復する方法" – Jojaman

+2

しかし、そうです...データは、DataProviderから利用可能なContactオブジェクトに入れられます。したがって、行にアクセスする必要はなく、プロバイダからリストを取得してこの行を繰り返し処理するだけです。 – Nicktar

1

DefaultDataTableは、あなたがテーブルの表示されたモデルをキャッチすることができますthathメソッド内のメソッドnewRowItemを持っている:

private List<IModel<T>> models= new LinkedList<IModel<T>>(); 
    @Override 
    protected Item<T> newRowItem(final String id, int index, 
      final IModel<T> model) { 
       models.add(model); 
    } 
0

あなたが持っているコードを示した場合に特異的であることが容易になるだろうが、私はこれに対する2つの一般的なアプローチを考えることができます。

1つの方法は、モデルを構築するときにDefaultDataTableの外側にあるモデルへの参照リストを維持することです。

これを行う方法が見つからない場合は、WicketのIVisitorの実装を使用して、モデルを含むコンポーネントのデータテーブル内のコンポーネントを検索します。

WebMarkupContainerクラスは、すべてが特定のクラスの成分を含有横断するために使用することができる方法

public final <S extends Component> Object visitChildren(final Class<?> clazz, 
    final IVisitor<S> visitor) 

、及びに制限方法

public final Object visitChildren(final IVisitor<Component> visitor) 
同じ行い

しかし無しを有します特定のクラス。

IVisitor<T extends Component>インターフェースはメソッドの引数として発見された各構成要素とこれらの「訪問」メソッドによって呼び出され

public Object component(T component) 

を定義する必要があります。戻り値は、トラバーサルを続行または終了するための信号で、定義したメソッドは、コンポーネント内で見つかったものをリストに集めることができます。

3

正直なところ、他の(より基本的な)ものが間違っているようです。 martin-gが言及しているように、編集可能なプロパティーの列はプロパティー・モデルを使用します。つまり、フォームが送信されると(すべての検証などが成功した場合)、そのモデルでsetObjectが呼び出され、setFoo foo "はその列のプロパティです)、テーブル内のその行のデータをバックアップするPOJO上にあります。

あなたは、(Donが言及するように)訪問者を使用してテーブルの子を反復することができます。しかし、一般的には、これはあなたが何か間違っていることを意味します。 Wicketは、フォーム提出からデータを引き出し、あなた自身をあなたのPOJOにプッシュする必要がないように書かれています。モデルはあなたのためにそれを行う必要があります。自分の周りにデータを「押し込む」べきではありません。

いくつかのコードを表示すると役立ちますが、それは欠けています:あなたのテーブルがどこから(その連絡先のリストなど)どこのデータを取得しても、その同じオブジェクトからデータを取得するだけです。それはすでにあなたのために設定されているはずです。そうでない場合は、特にテーブルとデータプロバイダを初期化する場所にコードを投稿してください。

関連する問題