以下是难题的简单版本。。看有否谁知道怎样去用event trigger+ajax refresh在list view里面的form component.
I have created a list view which will show number of records in table view and inside the listview contains a textfield and a dropdownchoice field.
What I need to achieve is onchange of the textfield to default the value in the dropdownchoice for a particular record. But appears that when using the following codes, when its only 1 record to be updated, it works, but when multiple records exist, it will fail. Need help! Thanks in advance.
Sample Code:
new ListView("list", getItemList()) {
protected void populateItem(ListItem item) {
final Sl qv = (Sl) item.getModelObject();
item.setModel(new CompoundPropertyModel(qv));
ratio = new TextField("ratio");
item.add(ratio);
ratio.setOutputMarkupId(true);
ratio.add(new AjaxFormComponentUpdatingBehavior("onkeyup") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
getProperties().put("rating" + Sl.getid(), "Strong");
target.addComponent(rating);
}
});
rating = new DropDownChoice("rating", getDdlmodels().get(item.getIndex()), ratingList);
item.add(rating);
rating.setOutputMarkupId(true);
}
}
Note: PropertyModel with ValueMap properties as key (DdlModels) has been used to get and set value of the dropdownchoice. Upon onchange of the textfield, the propertyModel has been updated, however the dropdownchoice has not been refresh/re-rendered even though I have added for ajax refresh.
I believe its something related to the target.add(rating), which I think can't be refreshed in this way, but I can't find other way.
终于有高手帮我解决了。。。原来是stupid mistake。。皆因不大了解wicket的listview..
回复删除======= 解决方案 ==========
The problem is that you "bind" all textfields to the last "rating" since it's a private member of your class.
When the "onUpdate" behavior gets called, it will use the rating member that is declared outside the scope of the populate item method thus the one assigned at the last iteration of the listview.
That's why it works for one record. Your current implementation should work for the last "row" only.
The "rating" variable should be declared inside the populate item method.
=======正确的写法==========
new ListView("list", getItemList()) {
protected void populateItem(ListItem item) {
TextField ratio;
DropDownChoice rating;
final Sl qv = (Sl) item.getModelObject();
item.setModel(new CompoundPropertyModel(qv));
ratio = new TextField("ratio");
item.add(ratio);
ratio.setOutputMarkupId(true);
ratio.add(new AjaxFormComponentUpdatingBehavior("onkeyup") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
getProperties().put("rating" + Sl.getid(), "Strong");
target.addComponent(rating);
}
});
rating = new DropDownChoice("rating", getDdlmodels().get(item.getIndex()), ratingList);
item.add(rating);
rating.setOutputMarkupId(true);
}
}