2013年8月29日星期四

Wicket - Dynamic refresh DropDown inside List View

最近工作遇到难题难以解决。。需要这方面的高手帮忙解决难题。。不然难以交货。。

以下是难题的简单版本。。看有否谁知道怎样去用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.

1 条评论:

  1. 终于有高手帮我解决了。。。原来是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);
    }
    }

    回复删除