这是我的zul代码:
<combobox id="digitalPublisherCombobox" value="@load(ivm.inventory.digitalPublisherName)"
onOK="@command('setDigitalPublisher', digitalPublisherBox = self)"
onSelect="@command('setDigitalPublisher', digitalPublisherBox = self)"
onChanging="@command('setupQuicksearchByEvent', searchlayout = event, prefix = 'PUB', tags = 'PublisherName, PublisherNameTranslit')"
mold="rounded" hflex="1" buttonVisible="false" autodrop="true">
<comboitem self="@{each=entry}" value="@{entry.key}" label="@{entry.value}"/>
</combobox>
这是QuickSearch实施:
@Command
public void setupQuicksearchByEvent(@BindingParam("searchlayout")Event event, @BindingParam("prefix") String prefix, @BindingParam("tags") String tags) throws WrongValueException, SearchException, IOException
{
if(event instanceof InputEvent)
{
InputEvent inputEvent = (InputEvent) event;
String inputText = inputEvent.getValue();
List<String> searchFields = Arrays.asList(tags.split(","));
ListModel model = new ListModelMap(ZKLogic.findDocsStartingWith(prefix, searchFields, "proxy", inputText), true);
ListModel subModel = ListModels.toListSubModel(model, Autocompleter.MAP_VALUE_CONTAINS_COMPARATOR, 10);
Combobox searchBox = (Combobox) event.getTarget();
searchBox.setModel(subModel);
searchBox.setItemRenderer(new ComboitemRenderer()
{
@Override
public void render( Comboitem item, Object data, int pos ) throws Exception
{
String publisherString = data.toString();
UID key = getUidFromPublisherString(publisherString);
int startIndex = publisherString.indexOf('=') + 1;
String publisher = publisherString.substring(startIndex);
item.setLabel(publisher);
item.setValue(key);
}
});
}
}
ZKLogic.findDocsStartingWith
返回带有UID-key和String-value的地图。
使用上面的代码,当我切换到另一个窗口时,我实现了下拉列表。我需要输入内容,然后选择另一个浏览器或记事本窗口 - 并且会立即显示comboitems。
所以,我的问题仍然需要回答,是否有任何技术可以在代码中重现这个窗口切换?或者,也许我应该做自动完成什么,因为我已经有了一些交流预装的名单工作,但是这件事情应该从数据库只返回10条记录,而不是所有70000项,每次当用户输入一些领域。
编辑20/09/2013:问题仍然存在。重命名一下问题,因为我需要的是在代码中强制调用render选项。有办法吗?代码没有太大变化,但是渲染方法中的print选项表示,该方法可能会错过两个或更多onChange事件并突然为一个变体呈现文本。
也许你知道zk框架中的另一个自动完成选项,数据库参与了哪些?如果有工作实施指南,我准备改变实施。
答案 0 :(得分:3)
好的我看到两个问题,你应该先解决。
setupQuicksearchByEvent(...)
的每次通话中设置渲染器
这不符合逻辑,因为每次都是一样的
添加到zul combobox标签类似于
itemRenderer="@load(ivm.myRenderer)" ....
修复了这两个问题后,我们可以将这些问题排除在意外行为的原因之外,如果它仍然存在,则将其修复。
好的,我有两种方法可以解决它。
致电Combobox#invalidate()
这可以迫使zk重新使用Combobox
,但可以
导致性能低下,我不喜欢这个。
使用Listbox
选择模具而不是Combobox
要强制重新渲染,请使用Listbox#renderAll()
答案 1 :(得分:1)
尝试在组合框上设置所选项目或抛出相关事件
答案 2 :(得分:0)
解决方案很简单。真。没有什么比蛮力更好了,但我想我试图避免它并在绝望中使用它。
@Command
public void setupQuicksearchByEvent(@BindingParam("searchlayout")Event event, @BindingParam("prefix") String prefix, @BindingParam("tags") String tags) throws WrongValueException, SearchException, IOException
{
if(event instanceof InputEvent)
{
InputEvent inputEvent = (InputEvent) event;
String inputText = inputEvent.getValue();
List<String> searchFields = Arrays.asList(tags.split(","));
Map<UID, String> publishers = ZKLogic.findDocsStartingWith(prefix, searchFields, "proxy", inputText);
Combobox searchBox = (Combobox) event.getTarget();
searchBox.getChildren().clear();
for (Map.Entry<UID, String > entry : publishers.entrySet())
{
Comboitem item = new Comboitem();
item.setLabel(entry.getValue());
item.setValue(entry.getKey());
searchBox.appendChild(item);
}
}
}