我有一个:
我需要填充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
时,这不会发生。谢谢你的帮助。
答案 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 “匹配过滤器中定义的限制的数据。
希望它有所帮助。最好的问候。