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

Java Wicket-使用AJAX和Wicket模型更新ListView,java,html,ajax,wicket,Java,Html,Ajax,Wicket,我有一个: 客户端类 列表视图 文本字段 我需要填充我的ListView以形成一个表: 工作代码: clientModel = new LoadableDetachableModel() { @Override protected Object load() { return Client.getClientListByCompanyName(searchClientInput.getValue());

我有一个:

  • 客户端类
  • 列表视图
  • 文本字段
我需要填充我的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);
clientModel=newloadabledetachablemodel(){
@凌驾
受保护对象加载(){
返回Client.getClientListByCompanyName(searchClientInput.getValue());
}
};
searchClientInput.setModel(新模型());
searchClientInput.add(新的AjaxFormComponentUpdateBehavior(“onkeyup”){
@凌驾
受保护的void onUpdate(AjaxRequestTarget目标){
target.add(clientListViewContainer);
}
});
clientListView=新建ListView(客户端\行\列表\ ID,clientModel){
@凌驾
受保护的void populateItem(列表项){
Client=item.getModelObject();
添加(新标签(客户机行公司号,CLIENT.getCompanyName());
添加(新标签(CLIENT\u ROW\u COMPANY\u NAME\u ID,CLIENT.getCompanyCnpj());
}
};
clientListViewContainer.setOutputMarkupId(true);
添加(clientListView);
添加(clientListViewContainer);
现在,在我的HTML中,我有一个文本字段。每当用户在此文本字段中键入内容时,将在数据库中对其键入的内容进行选择。因此,对于每个单词,都会进行选择,并且需要更新表格。我猜我需要使用AJAX,可能还需要一个模型。我有点不知所措,如果有人能给我举个例子,我将不胜感激

编辑:引发异常的新代码:
最后一个原因:尝试在组件的空模型上设置模型对象:searchClientForm:searchClientInput

编辑2:好的,例外是我的文本字段没有绑定数据的模型。所以我做的是:
searchClientInput.setModel(新模型())


我对这件事也有意见。使用
onkeydown
是可行的,但没有达到预期效果。我的公司名是1-4。如果我键入公司名称1,我需要再次按下一个键,以便更新表。使用
onkeyup
不会发生这种情况。感谢您的帮助。

您可以为ListView提供一个LoadableDetachableModel,它提供与您的文本字段值相匹配的选定客户端


在文本字段上使用AjaxFormComponentUpdateingBehavior,将ListView的父级添加到请求目标(不要忘记#setOutputMarkupId()。

您可以为ListView提供一个LoadableDetachableModel,它提供与文本字段值匹配的选定客户端


在文本字段上使用AjaxFormComponentUpdateBehavior将ListView的父级添加到请求目标(不要忘记#setOutputMarkupId()。

我认为执行所需操作的最佳方法(即在每次输入更改-->DB访问时重新绘制表/列表)是使用DataView和DataProvider

DataView与ListView组件类似,只是它使用IDataProvider来获取要显示的数据。您可以实现DataProvider,以便它访问您的数据库,并且可以向DataProvider添加限制(
where
子句)

[这更像是伪代码]

公共最终类MyDataProvider扩展了SortableDataProvider{
// ...
设置过滤器;
//过滤器是存储要应用的限制的集合
...
@凌驾
公共迭代器迭代器(int-first,int-count){
//DAO(数据访问对象)对数据库的访问
// ...
返回dao.findByRestrictions(filters.iterator();
}
...
}
现在,在输入组件上的ajax事件中,您可以更新DataProvider中使用的过滤器,并且在DataView的下一次重新绘制中,该过滤器将“提取”与过滤器中定义的限制匹配的数据


希望能有所帮助。致以最诚挚的问候。

我认为执行所需操作的最佳方法(即在每次输入更改-->DB访问时重新绘制表/列表)是使用DataView和DataProvider

DataView与ListView组件类似,只是它使用IDataProvider来获取要显示的数据。您可以实现DataProvider,以便它访问您的数据库,并且可以向DataProvider添加限制(
where
子句)

[这更像是伪代码]

公共最终类MyDataProvider扩展了SortableDataProvider{
// ...
设置过滤器;
//过滤器是存储要应用的限制的集合
...
@凌驾
公共迭代器迭代器(int-first,int-count){
//DAO(数据访问对象)对数据库的访问
// ...
返回dao.findByRestrictions(filters.iterator();
}
...
}
现在,在输入组件上的ajax事件中,您可以更新DataProvider中使用的过滤器,并且在DataView的下一次重新绘制中,该过滤器将“提取”与过滤器中定义的限制匹配的数据


希望能有所帮助。向您致意。

“已选定”你是说你想要吗?在从中选择后获得自动更新也很棘手。要自动更新,请查看
AjaxFormComponentUpdateingBehavior
和friends。哎呀,我想我不是很清楚。我的意思是,对键入的每个字母在数据库中进行选择,然后更新列表。@Raystorm嘿,看看我的更新代码please.引发了一些异常,我正在试图找出原因。“已进行选择”你是说你想要吗?在从中选择后获得自动更新也很棘手。要自动更新,请查看
AjaxFormComponentUpdateingBehavior
和friends。哎呀,我想我不是很清楚。我的意思是,对键入的每个字母在数据库中进行选择,然后更新列表。@Raystorm嘿,看看我的更新代码p租约。出现了一些异常,我正在努力解决
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();
}
...
}