2011-11-12 66 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); 
... 

這裏是標記:如anwser

<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

我之前的評論:

您可能需要調用setReuseItems(真)在listview上。

ajaxifying一個列表視圖的另一種方法可以在the Wicket in Action blog找到

1

你的例子就是工作,如果你沒有添加以下行:

addLink.setDefaultFormProcessing(false); 

您的鏈接犯規過程的形式就像他會通常可以(更新模型等,請參閱IFormSubmitter

您可以使用嵌套窗體更新只需要的區域,並將defaultFormProcessing設置爲true。

像:

<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> 

檢票將確保你實際上並沒有您的標記內嵌套形式(它會替換一個div嵌套形式),因爲它是無效的HTML。但是,如果表單嵌套的話,它將起作用。

1

你必須使用該模型從目標是這樣的:

IModel model = target.getModel(); 

再投給ListView。我不知道這是否可行,但我在這裏有一些類似的代碼。