对于我的webapp的搜索功能,我给了我的用户一个字段来输入他们的查询,而不是多个输入字段,他们可以使用特殊语法使他们的查询更具体。为了简化编写这些查询的过程,我正在使用JQueryUI's autocomplete widget。作为用户类型,我正在解析他们的查询,确定他们当前正在键入的内容的上下文,并给他们相关的自动完成。例如 - 如果用户使用客户端过滤语法,我会给他们一个所有客户端的列表(按他们已经写过的部分客户名称进行过滤)。
我实施的这部分很有效。现在,我过滤的一些字段是日期字段。为这些提供建议列表是有道理的,但我确实希望允许我的用户使用JQueryUI's datepicker widget输入这些日期。我考虑使用_renderMenu,但据我所知,我需要使用widget工具(这似乎是一种矫枉过正),我不知道如何调用常规列表完成的正常行为,如果我重写了_renderMenu
。
我设法制定了一个hacky解决方案 - 使用空白数组打开pop-widget并使用open
event添加datepicker。这是有效的,但我必须传递指令来创建一个日期选择器而不是通过JQuery's in-DOM data storage使用常规小部件,这只是感觉很讨厌......
有没有正确的方法来做我想做的事?
更新(有点偏离主题)
Zee Tee想在评论中知道我如何确定何时定期自动完成列表以及何时打开datepicker,因为我正在使用单个字段。好吧,字段中的文本实际上是一个查询,我在客户端解析,因此在我的JavaScript代码中可以完全访问它的抽象sytnax树。我使语法非常轻松,所以我可以解析半查询并仍然获得有效的AST。当我执行自动填充功能时,我会在插入符号之前部分查询并解析它。然后我在语法树中向右下,直到找到可以自动完成的东西。
例如 - 假设我有一个查询client=jack date<
,插入符号就在最后。我将其解析为:
and:
- equals:
- field: client
- text: jack
- less-than:
- field: date
- text:
我无法为and
提供自动完成功能,因此我必须在AST中右下方less-than
。这是我认为是datepicker模式的模式,因此我显示了一个datepicker。如果插入符号位于“jack”一词的中间,我会得到这个AST:
- equals:
- field: client
- text: ja
我认为这是显示客户列表的模式,按“ja”过滤。
所以 - 确定要显示的内容很容易 - 问题是如何。