5

フォームにコンポーネントを動的に追加するのに問題があります。私がやろうとしているのは、名前、年齢、...などの選択可能な項目を含むドロップダウンリストをユーザーに提供することです。

ユーザーが追加を押すと、1つのコンポーネントに(ラベル+入力ボックス)が表示され、値を入力できるようになります。選択されていないコンポーネントを非表示にできると思うかもしれませんが、ユーザーはドロップダウンリストに値を追加することもできます。

私が抱えている問題は、HTMLにwicket:idsを含めずにコンポーネント(ラベル+入力ボックス)を追加および削除する方法です。

これは私が追加しようとしているものです:

<wicket:panel>
  <div wicket:id="hldValue">
    <label wicket:id="lblValue"></label>
    <input type="text" wicket:id="value"/>
  </div>
</wicket:panel>

ここでの問題は、IDが常に動的に名前を付けたい値であるということです。ダイナミックHTMLを使用してこのコンポーネントを作成するのは良い考えですか?私はオーバーライドgetMarkupResourceStreamgetCacheKeyて、これを達成しています。それでも、これは正しい方法ではないと感じています。他に何か提案はありますか?

4

2 に答える 2

7

リストビューが必要なのは、パネルのタイプ、リストビューでロジックを追加するモデル、少なくとも2つのフォーム、ユーザーが追加するデータを選択するドロップダウン用、最後にデータ全体を送信するためのモデルを使用できるためです。リストビュー。AJAXを使用できますが、オプションです

フォームコンポーネントでリピーター(ListViewは高度なリピーター)を使用する方法を知るために、ここで彼の基本的な使用法を知ることができますここフォームコンポーネントでの使用法について、そして最後にここでAJAXでの使用方法を知ることができます。

ところで、私は例を持っています、ここにコードの重要な部分があります。

これはListView.classのpopulateItemメソッドです

 @Override
 protected void populateItem(ListItem<ListViewModel> item) {     
     item.add(new TextField<Integer>("quantity", new PropertyModel<Integer>(item.getDefaultModelObject(),
     "averageQuantity"));
     item.add(new TextField<Integer>("position", new PropertyModel<Integer>(item.getDefaultModelObject(), "order"))
     .add(new IntegerValidator()));
     item.add(new Label("description", item.getModelObject().getName()));
     item.setOutputMarkupId(true);
 }

他の場所では、ドロップダウンを自分のフォームに追加してから、送信時にたとえばlistViewオブジェクトを操作する必要があります。

 // I use a AjaxButton to perform the user submit if you don't 
 // want use it, you should reload the entire page
 @Override
 protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
     //redraw the parent of the list view 
     target.add(theContainerOfTheListView);
     //the submited model of the dropdown
     ListViewModel item = form.getObject();                
     List<ListViewModel> list = listViewObject.getObject();
     list.add(item);
     //you could sort the list object in order to sort the listViewObject
 }

更新:新しいアイテムをリストビューに追加する前に、リストビューのフォームコンポーネントを送信する必要があります。送信しないと、ユーザーの変更が失われます。

于 2012-11-20T23:33:30.510 に答える
2

ページからコンポーネントを追加/削除する必要はありません。コンポーネントを動的に表示/非表示にすることができます。setVisible(false)コンポーネントを非表示にするために使用します。これが彼らの初期状態になります。

setOutputMarkupPlaceholderTag(true)また、動的に非表示/表示するコンポーネントを呼び出す必要があります。

コンポーネントを表示する必要がある場合は、を呼び出しますsetVisible(true)onClick()これは、Ajaxボタンのメソッドによってトリガーできます。

于 2012-11-18T23:04:37.437 に答える