使用wicket中的高级模型自动完成

时间:2011-09-07 14:56:42

标签: ajax model wicket

首先我想说我看到了一个网站:
https://cwiki.apache.org/WICKET/autocomplete-using-a-wicket-model.html

我仍然遇到实施问题。

上下文
我有表格想要从我的数据库编辑订单。 我想在表单中自动完成客户端的名称并将其保存到数据库。

问题
我可以看到客户名称的建议,我可以选择我将使用的客户名称。 就在我提交表单时,新客户端将不会按顺序保存在数据库中。 我不知道如何将表单模型与AutoCompleteTextField输入相关联。

有什么想法吗?

我班级的伪代码:

Order{
  Long id;
  String date;
  Client client;
  Status status;
  ...
}

Client{
  Long id;
  String name;
  String nip;
  String address;
  String postcode;
  String city;
  String phone;
  String mail;
  ...
}

Status{
   Long id;
   String name;
   String value;
}

编辑:
是的,你是对的。

我在网站上实现AbstractAutoCompleteTextField:

AbstractAutoCompleteRenderer autoCompleteRenderer = new AbstractAutoCompleteRenderer() {

                protected final String getTextValue(final Object object) {
                    Client client = (Client) object;
                    return client.getName();
                }

                protected final void renderChoice(final Object object, final Response response, final String criteria) {
                    response.write(getTextValue(object));
                }

            };


            // textfield
            AbstractAutoCompleteTextField<Client> name = new AbstractAutoCompleteTextField<Client>("name", new PropertyModel(order, "client"), autoCompleteRenderer) {

                protected final List<Client> getChoiceList(final String input) {
                    return clientService.findByNames(10, 0, input);
                }

                protected final String getChoiceValue(final Client choice) throws Throwable {
                    return choice.getId().toString();
                }
            };
form.add(name);

我要求的表单实现:

form = new Form("orderForm", new CompoundPropertyModel(order)) {
            @Override
            public void onSubmit() {
                orderService.update((Order) getDefaultModelObject());
                setResponsePage(OrdersPage.class);
                // Form validation successful. Display message showing edited
                // model.
            }
        };

通过这段代码,我得到了:“'Hurtownia Techniczna”ADA“'不适合客户。” (翻译自波兰语)在反馈小组中。

1 个答案:

答案 0 :(得分:3)

我认为,这就是出错的地方: AbstractAutoCompleteTextField<Client> name = new AbstractAutoCompleteTextField<Client>("name", new PropertyModel(order, "client"), autoCompleteRenderer)

编辑其余部分以反映正确的用例

具体来说:您正在创建订单客户端值的PropertyModel,它是一个Client-Object并将其绑定到TextField。要从TextField创建Client对象,wicket需要一个转换器。有许多内置转换器,但它们都不能转换为自定义对象。因此,您需要通过实现IConverter来提供转换器。由于我不知道您如何存储和检索客户端对象,因此我只能向您展示一个通用示例,即我的一个项目中使用的Locale-Converter:

public class LocaleConverter implements IConverter {

    private static final long serialVersionUID = 3251433094703013493L;

    /* (non-Javadoc)
     * @see org.apache.wicket.util.convert.IConverter#convertToObject(java.lang.String, java.util.Locale)
     */
    @Override
    public Object convertToObject(String value, Locale locale) {
    Locale retValue = null;
    try {
        retValue = LocaleUtils.toLocale(value);
    } catch (IllegalArgumentException e) {
        throw (new ConversionException("" + value + " is not a valid locale.", e));
    }
    return retValue;
}

    /* (non-Javadoc)
     * @see org.apache.wicket.util.convert.IConverter#convertToString(java.lang.Object, java.util.Locale)
     */
    @Override
    public String convertToString(Object value, Locale locale) {
        return value.toString();
    }

}

然后,您需要将新转换器注册到您的应用程序。同样,这对你来说会有所不同,因为你有一个不同的转换器......

@Override
protected IConverterLocator newConverterLocator() {
    ConverterLocator newConverterLocator = (ConverterLocator) super.newConverterLocator();
    newConverterLocator.set(Locale.class, new LocaleConverter());
    return newConverterLocator;
}

此方法需要包含在您的应用程序类中。