除了@Rock'n'muse 建议的答案之外,OP 发布的答案绝对是很好的命题,但都错过了一个重要且理想的功能方面。
当利用@Mat 给出的解决方案并实施@Rock'n'muse 的change-vice-close 建议时,如果没有从过滤器中进行选择,输入的值确实会从小部件中清除数据源。这很棒;但是,如果用户输入有效的内容并从过滤列表中选择一个值,然后将光标放在值的末尾并输入现在 使该值无效的内容(不从数据源返回任何有效的选择),输入的值不会从小部件中清除。
如果应该更改之前输入的(和有效的)值,isValid 的值仍然是true。对此的解决方案是在触发过滤事件后立即将isValid 设置为false。当用户更改输入的值时,小部件会尝试过滤数据源以搜索输入的值。触发filter 事件后立即将isValid 设置为false 可确保@Rock'n'muse 的解决方案所建议的change 事件的“干净状态”。
因为我们在触发filtering 事件时将isValid 设置为false,所以我们不需要在open 事件中这样做(因为数据源过滤必须在用户看到之前进行一个选项来选择)。因此,open 事件绑定已从 @Mat 的解决方案中删除。这也意味着在声明 isValid 时初始分配 false 是多余的,但在声明时分配变量总是一个好主意。
以下是来自@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 建议的简单布尔值比在数据上使用jQuery $.each(...)更简单 source 以确保键入的值与 change 事件中的数据源的实际项匹配。这是我在从@Mat(此页面)找到解决方案之前首先想到的解决方案,这就是我对他的解决方案和他的问题投票的理由。