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());
- 客户端类
- 列表视图
- 文本字段
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();
}
...
}