Wicket - 使用AJAX和Wicket模型更新ListView

时间:2012-08-23 17:27:06

标签: java html ajax wicket

我有一个:

  • 客户等级
  • 的ListView
  • 的TextField

我需要填充ListView以形成表格:

工作代码:

clientModel = new LoadableDetachableModel() {

            @Override
            protected Object load() {

                return Client.getClientListByCompanyName(searchClientInput.getValue());
            }
        };

        searchClientInput.setModel(new Model<String>());

        searchClientInput.add(new AjaxFormComponentUpdatingBehavior("onkeyup") {

            @Override
            protected void onUpdate(AjaxRequestTarget target) {

                target.add(clientListViewContainer);
            }
        });

        clientListView = new ListView<Client>(CLIENT_ROW_LIST_ID, clientModel) {

            @Override
            protected void populateItem(ListItem<Client> item) {

                Client client = item.getModelObject();

                item.add(new Label(CLIENT_ROW_COMPANY_CNPJ_ID, client.getCompanyName()));
                item.add(new Label(CLIENT_ROW_COMPANY_NAME_ID, client.getCompanyCnpj()));
            }
        };

        clientListViewContainer.setOutputMarkupId(true);

        clientListViewContainer.add(clientListView);

        add(clientListViewContainer);

现在,在我的HTML中,我有一个TextField。每当用户在此TextField中键入内容时,将在数据库中使用他键入的内容进行选择。因此,对于每个单词,都会进行选择,并且需要更新表。我猜我需要使用AJAX和可能的模型。我对如何做到这一点感到很遗憾,如果有人可以提供我的例子,我将非常感激。

编辑:抛出异常的新代码:Last cause: Attempt to set model object on null model of component: searchClientForm:searchClientInput

编辑2:好的,例外是我的TextField没有将数据绑定到的模型。所以我做的是:searchClientInput.setModel(new Model<String>());

我也遇到了这个事件的问题。使用onkeydown正在运行,但不是预期的。我有公司名称1-4。如果我输入公司名称1,我需要再次按一个键,以便更新表格。使用onkeyup时,这不会发生。谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

您可以为ListView提供一个LoadableDetachableModel,它提供与TextField值匹配的选定客户端。

在TextField上使用AjaxFormComponentUpdatingBehavior,它将ListView的父级添加到请求目标(不要忘记#setOutputMarkupId()。

答案 1 :(得分:1)

我认为执行所需内容的最佳方式(在每次输入更改时重新绘制表/列表 - &gt;数据库访问)都是使用DataView和DataProvider。

DataView与ListView组件类似,不同之处在于它使用IDataProvider来获取您想要呈现的数据。您可以实现DataProvider,以便访问您的数据库,并且可以向DataProvider添加限制(where子句)。

[这更像是伪代码]

public final class MyDataProvider<T> extends SortableDataProvider<T> {
// ...
Set filters; 
// filters is the set where the restrictions you want to apply are stored


...
@Override
public Iterator<T> iterator(int first, int count) {
    // DAO (Data Access Object) access to DB
    // ...
    return dao.findByRestrictions(filters).iterator();
}
...
}

现在,在输入组件上的ajax事件中,您可以更新DataProvider中使用的过滤器,并且在DataView的下一个重绘中,提供程序将“ pull “匹配过滤器中定义的限制的数据。

希望它有所帮助。最好的问候。