Читать книгу Forms over Data mit Knockout.js - Tilman Börner - Страница 8
throttle verzögert die Auslösung
ОглавлениеSofern der Event-Handler, der bei jedem Tastendruck ausgelöst wird, nur auf dem Client läuft, also nicht auf einen Server zugreifen muss, passiert das in zufriedenstellender Geschwindigkeit. Was aber, wenn für den eingegebenen Wert vom Server Daten geholt werden müssen? Dann würde bei jedem Tastendruck eine Anfrage über Ajax an den Server abgeschickt werden. Dieser Roundtrip, bis die Daten beim Client angelangt und verarbeitet sind, kann je nach Bandbreite und Geschwindigkeit des Servers dauern, was beim Eintippen eines Suchbegriffs nervtötend ist.
Für so ein Szenario bietet Knockout.js die Methode throttle an: Drosselung. Damit ist es möglich, das Setzen einer berechneten Observable zu verzögern. Beispiel: myval ist als ko.observable() an das value-Attribut des Eingabefelds gebunden. Über den Parameter valueUpdate wird die Bindung derart deklariert, dass sie myval bei jedem Tastendruck setzt.
mytext wiederum ist ein berechneter Wert, der sich im Wesentlichen aus myval ermittelt. An die Definition von mytext wird die Drosselung über die Methode extend angehängt. Damit verzögert Knockout.js eine Berechnung so lange, bis der Anwender eine gewisse Zeit nichts mehr eingegeben hat. Wie lange Knockout.js hier wartet, hängt von dem Parameter throttle ab. Der Wert ist die Anzahl der Millisekunden, die gewartet wird. In Code sieht das so aus:
viewModel.mytext = ko.computed(function(){
return viewModel.myval() }).extend({ throttle : 1000 });
Bitte beachten Sie: Sie können diese Berechnung nicht innerhalb der JSON-Deklaration von viewModel ausführen. Versuchen Sie das, erhalten Sie eine Fehlermeldung. Sie müssen die Berechnung nach der Deklaration dem Objekt viewModel hinzufügen. Der Grund ist, dass Sie innerhalb der JSON-Deklaration keinen Zugriff auf das Objekt selbst haben. this zeigt zu diesem Zeitpunkt noch auf DOMWindow, also das umgebende Fensterobjekt. viewModel selbst ist noch nicht definiert.
throttle lässt sich nun hervorragend für Ajax-Anfragen verwenden. Zum Beispiel so:
viewModel.mytext = ko.computed(function(){
$.getJSON('../jquerydata/service/index.php', {
"value" : viewModel.myval() },
function(da){
console.log(da.toString());
}
);
}).extend({ throttle : 1000 });
Die Ajax-Funktion getJSON von jQuery wird erst dann aufgerufen, wenn der Anwender eine Sekunde keinen Text mehr eingegeben hat. Als URL-Parameter value wird der Wert von myval übermittelt. Die übergebene Callback-Funktion im Aufruf von getJSON stellt das Ergebnis dar. Hier ließe sich natürlich auch eine Observable setzen und damit das Ergebnis direkt in der View anzeigen.
function(da){
if (da.person)
{
viewModel.lastname(da.person.lastname);
}
}
Wenn Sie Tipp 2 verwenden und sich den Inhalt des ViewModels anzeigen lassen, sehen Sie, dass sich bei der Eingabe in das input-Element nach dem Return schon etwas tut. Das Datenfeld lastname im ViewModel spiegelt den Wert im Control input wider.