2011-11-12 16 views
1

私はAJAXfied Wicketリストビューを実装しようとしています。私の研究では、this siteのコードを見つけて少し修正しました。モデルはAJAXサブミットリンク呼び出しでは更新されていません

モデルが正しく更新されていません。したがって、テキストフィールドに値が入力されるたびに、AJAX送信リンクが呼び出されると(テキストフィールドは空です)、値は忘れられます。なぜこれが起こるのですか?私はこのコードで何の問題も見ません。 Wicketのバージョンは1.5.2です。ここで

は、Javaコードです:

// Initialization of form 
... 

// List all rows 
ArrayList<String> rows = new ArrayList<String>(2); 
rows.add(new String()); 
rows.add(new String()); 

final ListView<String> lv = new ListView<String>("rows", rows) { 
    @Override 
    protected void populateItem(ListItem<String> item) { 
     int index = item.getIndex() + 1; 
     item.add(new Label("index", index + ".")); 

     TextField<String> text = new TextField<String>("text", item.getModel()); 
     item.add(text); 
    } 
}; 
rowPanel.add(lv); 

    AjaxSubmitLink addLink = new AjaxSubmitLink("addRow", form) { 

    @Override 
    protected void onError(AjaxRequestTarget target, Form<?> form) { 
     if (target != null) target.add(rowPanel);  
    } 

    @Override 
    protected void onSubmit(AjaxRequestTarget target, Form<?> form) { 
     lv.getModelObject().add(new String()); 
     if (target != null) target.add(rowPanel); 
    } 
}; 
addLink.setDefaultFormProcessing(false); 
rowPanel.add(addLink); 
... 

そして、ここでは、マークアップ:

<div wicket:id="rowPanel"> 
    <span wicket:id="rows"> 
     <span wicket:id="index">1.</span> 
     <input type="text" wicket:id="text"/> 
    </span> 
    <a href="#" wicket:id="addRow">Add row</a> 
</div> 
+2

リスト上でsetReuseItems(true)を呼び出すことができます。また、ここでその例を見ることができます:http://wicketinaction.com/2008/10/repainting-only-newly-created-repeater-items-via-ajax/ – bert

+1

@bertあなたのコメントを回答。これは正解である可能性が非常に高く、OPを正しい方向にリンクしています。あなたがしなければ私はします! :-) –

+1

@ XaviLópez:ありがとう。私はあなたに答えて喜んで;) – bert

答えて

3

anwserとしての私の以前のコメント:

あなたは(真)setReuseItemsを呼び出す必要がありリストビューで。

addLink.setDefaultFormProcessing(false); 

あなたのリンクdoesntのプロセスフォーム彼は希望のように:

リストビューをajaxifyingのもう一つの方法は、あなたが次の行を追加していなかった場合はあなたの例では、正常に動作しますthe Wicket in Action blog

1

で見つけることができますIFormSubmitterを参照してください。

必要な領域のみを更新してdefaultFormProcessingをtrueに戻すために、ネストされたFormsを使用できます。

のように:それは有効なHTMLではないため

<form wicket:id="form"> 
(...) <!-- (other form elements you dont want to get updated --> 
    <form wicket:id="repeaterForm"> <!-- form for your repeater textfields--> 
     <div wicket:id="refreshDiv"> 
      <input type="textfield" wicket:id="repeaterText" /> 
     </div> 
     <a wicket:id="addMoreLink>add more</a> 
    </form> 
</form> 

Wicketのは、あなたが実際にあなたのマークアップ内のフォームを入れ子になっていないことを確認しますが(それはdiv要素を持つネストされた形に置き換えられます)。それでもフォームがネストされているかのように動作します。あなたはこのようにターゲットからモデルを使用する必要が

1

IModel model = target.getModel(); 

はその後、リストビューにキャスト。私はこれがうまくいくかどうかは分かりませんが、ここに似たようなコードがあります。

関連する問題