0

我有一个 :

  • 客户端类
  • 列表显示
  • 文本域

我需要填充我的 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不会发生这种情况。谢谢您的帮助。

4

2 回答 2

2

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

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

于 2012-08-24T05:34:27.943 回答
1

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

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

[这更像是伪代码]

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 的下一次重绘中,提供程序将“”匹配过滤器中定义的限制的数据。

希望能帮助到你。最好的祝福。

于 2012-08-24T16:07:21.930 回答