Die Antwort des OP gepostet, zusätzlich zu der Antwort von @ Rock'n'muse vorgeschlagen sind definitiv gute Vorschläge, aber beide verpassen einen wichtigen und gewünschten funktionalen Aspekt.
Wenn die Lösung durch @Mat gegeben Nutzung und den change
-vice- close
Vorschlags von @ Rock'n'muse, der eingegebenem Wert Implementierung löscht zwar aus dem Widget, wenn keine Auswahl aus der gefilterten Datenquelle hergestellt wird. Das ist toll; Wenn der Benutzer jedoch etwas Gültiges eingibt und einen Wert aus der gefilterten Liste auswählt, setzt dann den Cursor an das Ende des Werts und gibt einen Wert ein, der den Wert ungültig macht (gibt keine gültige Auswahl aus dem Datenquelle), wird der eingegebene Wert nicht vom Widget gelöscht.
Was passiert ist, dass der isValid
Wert true
bleibt, wenn der zuvor eingegebene (und gültige) Wert geändert werden sollte. Die Lösung besteht darin, isValid
auf false
zu setzen, sobald das Filterereignis ausgelöst wird. Wenn der Benutzer den eingegebenen Wert ändert, versucht das Widget, die Datenquelle bei der Suche nach dem eingegebenen Wert zu filtern. Das Setzen von isValid
auf false
, sobald das Ereignis filter
ausgelöst wird, sorgt für eine "saubere Weste" für das Ereignis , wie von der Lösung von @ Rock'n'muse vorgeschlagen.
Weil wir isValid
auf false sind einstellen, sobald das filtering
Ereignis ausgelöst wird, müssen wir nicht tun, so im Fall open
(als Datenquelle Filterung erfolgen muss, bevor der Benutzer jemals eine Option wählen) . Aus diesem Grund wurde die Ereignisbindung open
aus der @ Mat-Lösung entfernt. Dies bedeutet auch, dass die anfängliche Zuweisung von false
bei der Deklaration von isValid
überflüssig ist, aber eine variable Zuweisung bei der Deklaration ist immer eine gute Idee.
Im Folgenden finden Sie die Lösung von @Mat zusammen mit den Vorschlägen von @ Rock'n'muse und mit der filtering
Implementierung angewandt:
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
});
Als Nachtrag, das select
Ereignis mit Bindung ein setzen und bewerten Ein einfacher boolescher Wert wie @Mat schlägt viel sauberer, einfacher und schneller als mit einem jQuery $.each(...)
auf der Datenquelle, um sicherzustellen, dass der eingegebene Wert einem tatsächlichen Element der Datenquelle innerhalb der change
Ereignis entspricht. Dies war mein erster Gedanke, eine Lösung zu entwickeln, bevor ich die Lösung von @Mat (diese Seite) gefunden habe, und dies ist meine Argumentation für die Abstimmung seiner Lösung und seiner Frage.
Wenn ein Benutzer keine gültige Auswahl trifft, wird, was auch immer sie in die AutoVervollständigung eingegeben haben, "Onblur" gelöscht, was das Ergebnis ist, nach dem ich bin – Mat
In meinen Tests die " close "Ereignis wird nicht ausgelöst, wenn der Benutzer einen Wert eingegeben hat, der 0 Elemente vom Server zurückgegeben hat. Das heißt, ich fange an "1234 .." einzugeben, was nichts vom Server holt und dann das Textfeld verlässt, das "close" -Ereignis wird nicht ausgelöst :-( – Dror
Dies ist nicht die richtige Antwort. Sie sollten die "Änderung" verwenden Ereignis, nicht "close". – ataravati