除了@Rock'n'muse 提出的答案之外,OP 发布的答案绝对是很好的提议,但都错过了一个重要且理想的功能方面。
当利用@Mat 给出的解决方案并实现@Rock'n'muse 的change
-vice-close
建议时,如果没有从过滤的数据源中进行选择,输入的值确实会从小部件中清除。这很棒; 但是,如果用户输入有效的内容并从过滤列表中选择一个值,然后将光标放在值的末尾并输入一些现在使该值无效的内容(不从数据源返回任何有效的选择),输入的值不会从小部件中清除。
发生的情况是,如果应该更改先前输入的(和有效的)值,则该isValid
值仍然存在。true
对此的解决方案是一旦触发过滤事件就设置为isValid
。false
当用户更改输入值时,小部件会尝试过滤数据源以搜索输入值。正如@Rock'n'muse 的解决方案所建议的那样,一旦触发事件,就设置isValid
为确保事件的“干净状态”。false
filter
change
因为我们在事件触发后isValid
立即设置为 false filtering
,所以我们不需要在open
事件中这样做(因为必须在用户看到可供选择的选项之前进行数据源过滤)。因此,open
从@Mat 的解决方案中删除了事件绑定。这也意味着false
声明时的初始赋值isValid
是多余的,但声明时变量赋值总是一个好主意。
以下是来自@Mat 的解决方案以及来自@Rock'n'muse 的建议以及应用的filtering
实现:
var isValid = false;
$("#staton").kendoAutoComplete({
minLength: 2,
dataTextField: "name",
select: function () {
valid = true;
},
change: function (e) {
// if no valid selection - clear input
if (!valid) {
e.sender.value("");
}
},
filtering: function () {
valid = false;
},
dataSource: datasource
});
作为附录,使用select
事件绑定来设置和评估一个简单的布尔值,正如@Mat 所建议的那样,比$.each(...)
在数据源上使用 jQuery 来确保输入的值与事件中的数据源change
。这是我在从@Mat(此页面)找到解决方案之前第一个想到解决方案的想法,这就是我对他的解决方案和他的问题进行投票的理由。