1

我正在编写一个基于 的复合组件Combobox来执行标记化自动完成。基本思想是Combobox查询模型以查找与当前文本匹配的项目,并且当用户从呈现的选项中选择某些内容时,它会被添加到另一个列表中以进行标记化呈现。总体而言,它看起来就像您可能在 Facebook、Apple Mail 和其他各种地方看到的输入。

我目前的问题似乎源于无法真正确定用户何时从列表中选择了某些内容,而不是仅仅使用光标键向上/向下导航列表。Combobox#onSelect似乎在导航下拉列表中的选项列表时被触发,而我真正需要的是一种在用户完成“我想要这个”操作时获取选择的方法,通常在下拉选择中按下 Enter下,或用鼠标手动选择下拉菜单中的条目。

到目前为止,我想出的最好方法是监视Combobox#onOpen,检查是否OpenEvent#isOpen为假,然后手动检查模型以进行选择。

是否有更好的方法来了解或检测“我想要这个”场景并将其与onSelect“我想要第三个选项关闭,所以我将 DOWN、DOWN、DOWN + ENTER”期间触发的事件区分开来?

下面的代码基本上就是我现在正在看的

public void onOpen$input(OpenEvent oe) {
    logger.info("OpenEvent.isOpen: {}", oe.isOpen());

    if (oe.isOpen() == false) {
        ListModel model = this.input.getModel();
        logger.info("model: {}", model);

        if (model instanceof Selectable) {
            logger.info("model is Selectable");
            Set<?> selection = ((Selectable) model).getSelection();
            logger.info("selection: {}", selection);
            for (Object selected : selection) {
                logger.info("selected: {}", selected);
                if (selected instanceof Comboitem) {
                    logger.info("selected is Comboitem");
                    selected = ((Comboitem) selected).getValue();
                    logger.info("selected: {}", selected);
                }

                addToken(selected);
            }
        }
    }
}
4

1 回答 1

0

仅仅是印象还是您真的尝试重新实现 Bandbox 但对于 Combobox?

查看org.zkoss.zul.Bandbox的类描述

似乎他们建议在 onOpen 上收听相同的事件。

于 2011-10-23T11:56:02.867 回答