2011-09-07 38 views
2

首先,我想说我看到了一个网站:
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的实现:

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. 
      } 
     }; 

有了这个代码,我得到:

你问
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); 

我的形式实施“ 'Hurtownia Techniczna “ADA”' 是不妥当的客户端“。 (从波兰语翻译)在反馈小组。

+0

所以,如果我得到这个权利,您的自动完成功能正在工作,但表单中选择的值不会在表单提交时被存储?如果是这样的话,我们可能需要查看一些你如何处理表单提交的代码。 – Tim

+0

in orderService.update()'你也更新客户端吗? – Nicktar

+0

我想我应该。当我使用DropDownChoice编辑状态时就足够了。我在我的问题中添加了Status类。 – bandit

回答

3

我想,这就是出问题: AbstractAutoCompleteTextField<Client> name = new AbstractAutoCompleteTextField<Client>("name", new PropertyModel(order, "client"), autoCompleteRenderer)

编辑答案的休息,以反映正确使用的情况下

具体来说:您建立订单的客户的PropertyModel值,它是一个Client-Object并将其绑定到TextField。为了从TextField创建客户端对象,wicket需要一个转换器。有许多内置转换器,但它们都不能转换为自定义对象。因此,您需要通过实施IConverter来提供转换器。因为我不知道你是如何存储和检索你的客户对象,我只能告诉你一个普通的例子做,在我的一个项目使用的语言环境的转换器:

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; 
} 

这个方法需要包含在你的应用程序类中。

+0

我试过这种方式:PropertyModel(order.getClient(),“name”)。这样我可以提交表单,但客户端不会更新(还有旧的)。 – bandit

+0

您是否认为我可以使用IConverter创建2个文本框(名称和压区)autocopletable,或者仅使用一个文本框就可以? – bandit

+0

a)您仍然必须在订单服务中更新您的客户。因为你正在设置一个新的对象(改变订单表中的外键),所以状态起作用。 b)我认为IConverter不会在这里提供帮助。这只是不正确的用例。我只是添加了这部分作为excursus。 – Nicktar