gpt4 book ai didi

json - FilteringSelect 与 QueryReadStore : selection doesn't stick

转载 作者:行者123 更新时间:2023-12-05 01:11:42 25 4
gpt4 key购买 nike

我正在使用由 dojox.data.QueryReadStore 支持的 dijit.form.FilteringSelect 以允许用户选择区域(考虑“自动完成” “机制)。在用户输入的每个字符上,QueryReadStore 向服务器发送一个请求,等待匹配区域(具有相关 ID)的 json 列表。在显示足够短的列表时,用户可以选择所需的项目。 [不可否认,查询每次击键并不是最有效的模式,但现在已经足够了。]

意外行为:在一些罕见但特定的情况下,用户做出的选择“不会坚持”。例如,如果用户键入“can”,她会按顺序看到以下选项:

Atlantic Canada
Canada
English Canada
Lower Canada
Upper Canada
Western Canada

如果她在其中选择“Canada”,dijit 会关闭下拉选择,并正确选择她的选择。但是当用户离开该字段时,选择会切换到“Atlantic Canada”!

这种奇怪的现象系统地发生在少数特定地区。 (起初,我认为这些表现不佳的地区之间的共同因素是它们的名称包含重音字符或连字符,但加拿大的例子显然不是这样。到目前为止,我未能发现规律。)

我在任何地方都没有发现任何类似问题的提及。我非常愿意进行调查,但是,由于我是 dojo 的新手,在我开始深入研究 dojo 的代码之前,我非常感谢您的指点:我应该先看哪里?可能导致该行为的一些可能问题是什么?我可以排除某些假设吗?我应该如何最好地使用控制台(或 Firebug)来深入了解这个问题?等

dojo 1.1.1 和 dojo 1.2.3 都会出现此问题。

这是 FilteringSelect 的(编程)生成:

new dijit.form.FilteringSelect({
name = "region";
autoComplete = false;
hasDownArrow = false;
labelAttr = "name";
queryExpr = "${0}";
store = new dojox.data.QueryReadStore({url:'/query/regions'});
}, myNode);

编辑(2009/02/18):其他详细信息

根据 damelin 的回答,我想了解 FilteringSelect 对这种情况的看法。假设我将日志记录函数连接到 FilteringSelect 的事件 onChangeonBlur,我得到以下逐个播放序列:

  • 我在字段中单击并键入:can
  • 出现 6 个区域的下拉列表(上面列出)
  • 使用键盘光标,我将列表向下移动到“Canada”(这是 id 为 1 的区域)
  • 我按 Enter(从而选择商店的商品)。下拉列表现在已经消失,文本“Canada”出现在字段中。此时,第一个事件被触发,记录如下:

    onChange event: region 1
  • 我按 tab 键离开了该字段。在这里,两个事件按以下顺序依次触发:

    onBlur event: region 1
    onChange event: region 246

(区域 246 是 Atlantic Canada。)这很有趣……当我离开该字段 (onBlur) 时,Canada 仍然是所选值。神秘的交换只在那之后发生......

最佳答案

我想我终于找到了这种行为的解释。简而言之,这是由于 FilteringSelect 从 QueryReadStore 期望的契约(Contract)未履行而发生的。由于 QueryReadStore 完全依赖服务器模块的响应,它生成 json,因此由于服务器的意外响应而无法履行契约(Contract)。

正如我发现的那样,在用户输入结束时 FilteringSelect 期望 Store(在本例中为 QueryReadStore)仅返回与输入或选择的字符串完全匹配的项目。 FilteringSelect 认为输入在按下回车键或用户离开字段时结束。在这两个事件之前,输入或选择的文本只是文本。目前实际上没有选择任何项目。

换句话说,在输入结束时,FilteringSelect 期望 Store 返回零个项目(如果不应选择任何项目)或一个项目(应该选择)。因此,当您提供区域列表时,FilteringSelect 无法确定选择哪个区域,并会停在第一个区域。

正如您提到的,QueryReadStore 在每次击键时发送请求。在这种情况下(在输入结束之前)FilteringSelect 期望 Store 返回匹配模式的项目。默认模式是“enteredString*”,其中星号是任何序列。

为了区分两种情况,QueryReadStore 请求略有不同:

  • 每次击键的示例请求:/query/regions?name=enteredString*&start=0&count=5
  • 输入结束时的示例请求:/query/regions?name=enteredString&start=0

如您所见,在第二个请求中,“enteredString”的末尾没有星号。这种变化有助于在服务器端建立正确的响应。

希望我已经解释清楚了。如果没有,欢迎您提问。

关于json - FilteringSelect 与 QueryReadStore : selection doesn't stick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/472059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com