我正在使用Wicket在网站上为搜索引擎建立一个ui。当用户输入时,结果显示在下拉列表中。由于我有很多不同的对象(每个对象都有不同的显示结构),我想定义几个面板。因此,对于db中的每个找到的项目,它将获得正确的面板和正确的结构。例如:如果searchengine找到一个用户,它应该只显示名称。当找到图片,缩略图和描述等时......
现在我正在使用AutocompleteTextField但它只需要字符串。我想在字符串中添加html并将其显示出来。但由于这不是一个干净的解决方案,我正在考虑使用面板。
那么,有谁知道如何在AutoCompleteTextField中使用面板而不是字符串?
答案 0 :(得分:3)
AutoCompleteTextField
使用newAutoCompleteBehavior
- hookmethod来创建显示选项的行为。这个hookmethod以IAutoCompleteRenderer为参数。这个渲染器实际上正在显示部分。因此,您可以将自己的渲染器传递给AutoCompleteTextField(有一个构造函数接受一个)或子类AutoCompleteTextField
来覆盖工厂方法。无论哪种方式,您都必须提出自己的IAutoCompleteRenderer
实现,因为在wicket中没有这样的实现,渲染器本身将受到当前应用程序设计的严重影响。
答案 1 :(得分:3)
创建自己的组件。使用ListView,将其放入WebMarkupContainer。显示基于TextField输入的WebMarkupContainer,并刷新附加到TextField的OnChangeAjaxBehavior中的ListView。
通过这种方式,您可以完全控制自己想要达到的目标。
ListView的示例代码:
private ListView getLv(){
ListView lv = new ListView(PANEL, new PropertyModel(this, "someList")) {
@Override
protected void populateItem(ListItem item) {
Integer type = item.getModelObject().getType();
if (type == 1) {
item.add(new PanelType1("panel", item.getModelObject().someIdMaybe));
} else if (type == 2) {
item.add(new PanelType2("panel", item.getModelObject().someIdMaybe));
}
}
};
return lv;
}
答案 2 :(得分:1)
我不认为可以使用面板,因为面板是一个组件,它本身可以是任何东西。支持任何面板作为自动完成列表的一部分将是非常困难的。将自动完成元素作为具有自动填充字段的表单会很有趣;)
因此,这就是为什么有IAutoCompleteRenderer
接口允许您为元素生成任何html标记,而不是作为面板。
作为一个选项,也许有可能使用ModalWindow
有一种模态弹出ajax对话框窗口。