gpt4 book ai didi

ajax - 使用 Wicket 口中的高级模型自动完成

转载 作者:行者123 更新时间:2023-12-04 06:15:13 26 4
gpt4 key购买 nike

首先我想说我看到了一个网站:
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”' 不是正确的客户。” (从波兰语翻译)在反馈面板中。

最佳答案

我认为,这就是事情出错的地方:AbstractAutoCompleteTextField<Client> name = new AbstractAutoCompleteTextField<Client>("name", new PropertyModel(order, "client"), autoCompleteRenderer)
其余答案已编辑以反射(reflect)正确的用例

具体来说:您正在为您的订单客户值(value)创建一个 PropertyModel,它是一个 Client-Object 并将其绑定(bind)到一个 TextField。要从 TextField 创建一个客户端对象,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;
}

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

关于ajax - 使用 Wicket 口中的高级模型自动完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7335998/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com