6

这是我的 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 键和字符串值的映射。

使用上面的代码,当我切换到另一个窗口时,我实现了获取下拉列表。我需要输入一些内容,然后选择另一个浏览器或记事本窗口 - 组合项将立即显示。

所以,我的问题仍然需要回答,是否有任何技术可以在代码中重现此窗口切换?或者也许我应该对自动完成做一些事情,因为我有一些 ac 正在处理预加载的列表,但是每次用户在字段中键入内容时,这个东西应该只从 db 返回 10 条记录,而不是所有 70000 个条目。

编辑 20/09/2013:问题仍然存在。稍微重命名问题,因为我需要的是在代码中强制调用渲染选项。有什么办法吗?代码没有太大变化,但渲染方法中的打印选项表示,该方法可能会错过两个或更多 onChange 事件并突然为一个变体渲染文本。

也许您知道数据库参与的 zk 框架中的另一个自动完成选项?如果有关于它的工作实施的指南,我已准备好更改实施。

4

3 回答 3

3

好的,我看到两个问题,你应该先解决。

  1. 在每次调用setupQuicksearchByEvent(...).
    这不合逻辑,因为每次都是一样的。
    添加到 zul 组合框标签类似
     itemRenderer="@load(ivm.myRenderer)" .... 
  2. 如果您只想要 10 个项目,请不要让 db-request 返回超过 10 个。
    如果您在此处使用 JPA klick或此处使用sql或只是 google 一下。

在您修复这两个问题后,我们可以将这些作为意外行为的原因排除
并修复它(如果它仍然存在)。

编辑

好的,我有两种可能的方法来解决它。

  1. Call Combobox#invalidate()
    This should force zk to rerender the Combobox,但可能
    导致性能低下,我不喜欢这样。

  2. 与选择模具一起使用Listbox,而不是Combobox.
    要强制重新渲染,请使用Listbox#renderAll()

于 2013-09-25T08:09:14.697 回答
1

尝试在您的组合框上设置所选项目或抛出其相关事件

于 2013-09-20T20:36:59.477 回答
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);
        }
    }
}
于 2013-10-01T07:27:59.783 回答