Formularelemente sind die herkömmliche Art, mit Benutzern über eine Webseite zu interagieren. Das Arbeiten mit Formularen in Knockout.js entspricht weitgehend dem Arbeiten mit Aussehensbindungen. Da Benutzer Formularfelder bearbeiten können, verwaltet Knockout.js Aktualisierungen in beide Richtungen. Dies bedeutet, dass interaktive Bindungen sind zwei wege. Sie können programmgesteuert festgelegt werden und die Ansicht wird entsprechend aktualisiert, oder Sie können von der Ansicht festgelegt und programmgesteuert gelesen werden.
Abbildung 19: Knockout.js verbreitet sich in beide RichtungenSie können beispielsweise den Wert eines Texteingabefelds über das ViewModel festlegen und es wird in der Ansicht angezeigt. Wenn der Benutzer etwas in das Eingabefeld eingibt, wird die zugehörige Eigenschaft des ViewModel ebenfalls aktualisiert. Der Punkt ist, Knockout.js sorgt immer dafür, dass die Ansicht und das ViewModel synchronisiert werden.
Knockout.js enthält 11 Bindungen für die Interaktion mit dem Benutzer:
klicken
: Wert
: Veranstaltung
: einreichen
: aktivieren
: deaktivieren
: geprüft
: Optionen
:
Element mit einem ViewModel-Array.selectedOptions
:
Feld.hasfocus
: Wie die Erscheinungsbindungen, die in der vorherigen Lektion vorgestellt wurden, werden diese alle im data-bind-Attribut eines HTML-Elements definiert. Einige von ihnen (wie die klicken
bindung) kann an jedem Element arbeiten, andere (wie markiert) können jedoch nur mit bestimmten Elementen verwendet werden.
Einer der größten Vorteile der Verwendung von Knockout.js zur Verwaltung von HTML-Formularen ist, dass Sie immer noch müssen sich nur um die Daten sorgen. Immer wenn der Benutzer den Wert eines Formularelements ändert, wird das Update in ViewModel automatisch angezeigt. Dadurch ist es sehr einfach, Benutzereingaben in den Rest Ihrer Anwendung zu integrieren.
In dieser Lektion wird für das laufende Beispiel eine neue HTML-Seite verwendet. Anstelle einer Warenkorb-Anzeigeseite arbeiten wir mit einem Anmeldeformular für Neukunden. Erstellen Sie eine neue HTML-Datei mit dem Namen interactive-bindings.html
und füge folgendes hinzu:
Interaktive Bindungen
Dies ist eine vereinfachte Version dessen, woran wir in der gesamten Serie gearbeitet haben. In dieser Lektion machen wir uns nur Sorgen konfigurieren Formularelemente. Die Bearbeitung von Formularsendungen bleibt für die nächste Lektion erhalten.
klicken
BindungDie Klickbindung ist eine der einfachsten interaktiven Bindungen. Es ruft einfach eine Methode Ihres ViewModel auf, wenn der Benutzer auf das Element klickt. Fügen Sie beispielsweise die folgende Schaltfläche in der hinzu Element:
Wenn der Benutzer auf die Schaltfläche klickt, ruft Knockout.js die saveUserData ()
Methode auf PersonViewModel
. Außerdem werden zwei Parameter an die Handler-Methode übergeben: das aktuelle Modell und das DOM-Ereignis. Eine saveUserData () -Methode, die beide dieser Parameter verwendet, würde ungefähr so aussehen:
this.saveUserData = Funktion (Modell, Ereignis) alert (model.firstName () + "versucht zu überprüfen!"); if (event.ctrlKey) alert ("Er hat die Steuertaste aus irgendeinem Grund gedrückt gehalten."); ;
In diesem speziellen Beispiel, Modell-
bezieht sich auf die ViewModel-Instanz der obersten Ebene und Veranstaltung
ist das DOM-Ereignis, das durch Klicken des Benutzers ausgelöst wird. Das Modellargument ist immer das aktuell ViewModel, das den Zugriff auf einzelne Listenelemente in einer foreach-Schleife ermöglicht. So haben wir die removeProduct () -Methode in Lektion 3 implementiert:.
Wert
BindungDie Wertebindung ist der Textbindung, die wir in dieser Serie verwendet haben, sehr ähnlich. Der Hauptunterschied ist, dass es durch die geändert werden kann Nutzer, und das ViewModel wird entsprechend aktualisiert. Zum Beispiel können wir das verknüpfen Vorname
und Nachname
Observables mit einem Eingabefeld durch Hinzufügen des folgenden HTML - Formulars (vor dem
Vorname:
Nachname:
Das Wert: Vorname
Bindung sorgt dafür, dass die Der Text des Elements entspricht immer der Eigenschaft firstName des ViewModels, unabhängig davon, ob er vom Benutzer oder von Ihrer Anwendung geändert wird. Dasselbe gilt für die lastName-Eigenschaft.
Wir können dies weiter untersuchen, indem wir eine Schaltfläche zum Anzeigen des Benutzernamens und eine weitere zur programmgesteuerten Einstellung hinzufügen. Dies lässt uns sehen, wie die Wert
Bindungsarbeiten von beiden Seiten:
Die Handler-Methoden sollten in etwa wie folgt aussehen:
this.displayName = function () alert (this.firstName ()); ; this.setName = function () this.firstName ("Bob"); ;
Klicken Sie auf Anzeigename wird das ViewModel lesen Vorname
Eigenschaft, die dem entsprechen sollte Element, auch wenn es vom Benutzer bearbeitet wurde. Das Name einsetzen Die Schaltfläche legt den Wert der ViewModel-Eigenschaft fest zu aktualisierendes Element. Das Verhalten des letzteren ist im Wesentlichen dasselbe wie bei einer normalen Textbindung.
Der entscheidende Punkt hinter dieser Zwei-Wege-Synchronisation ist, dass Sie sich auf Ihre Daten konzentrieren können. Nachdem Sie ein eingerichtet haben Wert
bindend können Sie HTML-Formularelemente vollständig vergessen. Rufen Sie einfach die zugehörige Eigenschaft für das ViewModel ab, und Knockout.js kümmert sich um den Rest.
Wir werden das nicht brauchen Anzeigename
und setName-Methoden oder die entsprechenden Schaltflächen, sodass Sie sie löschen können, wenn Sie möchten.
Veranstaltung
BindungDas Veranstaltung
Mit der Bindung können Sie auf beliebige HTML-Elemente auf beliebige DOM-Ereignisse warten. Es ist wie eine generische Version von klicken
Bindung. Da es auf mehrere Ereignisse warten kann, muss ein Objekt Ereignisse zu Methoden zuordnen (dies ähnelt dem Parameter der attr-Bindung). Zum Beispiel können wir beim ersten Ereignis auf Mouseover- und Mouseout-Ereignisse warten Element mit dem folgenden:
Vorname:
Wenn der Benutzer auslöst Mouseover
Ereignis, ruft Knockout.js die zeige Details()
Methode unseres ViewModels. Ebenso wird hideDetails () aufgerufen, wenn er das Element verlässt. Beide haben die gleichen Parameter wie die Handler der Klickbindung: das Ziel des Ereignisses und das Ereignisobjekt selbst. Lassen Sie uns diese Methoden jetzt implementieren:
this.showDetails = function (target, event) alert ("Maus über"); ; this.hideDetails = function (Ziel, Ereignis) alert ("Mouse out"); ;
Nun, wenn Sie mit dem interagieren Vorname In diesem Feld sollten beide Meldungen angezeigt werden. Statt nur eine Warnmeldung anzuzeigen, zeigen wir für jedes Formularfeld zusätzliche Informationen an, wenn der Benutzer über das Feld fährt. Dafür brauchen wir eine weitere Beobachtungsmöglichkeit PersonViewModel
:
this.details = ko.observable (false);
Das Einzelheiten
property fungiert als Toggle, den wir mit unseren Event-Handler-Methoden ein- und ausschalten können:
this.showDetails = Funktion (Ziel, Ereignis) this.details (true); ; this.hideDetails = Funktion (Ziel, Ereignis) this.details (false); ;
Dann können wir den Toggle mit dem kombinieren sichtbar
Bindung zum Anzeigen oder Ausblenden von Formularfelddetails in der Ansicht:
Vorname: Dein Vorname
Der Inhalt der sollte erscheinen, wenn Sie mit der Maus über Vorname Feld und verschwinden, wenn Sie mit der Maus herausfahren. Dies ist ziemlich nahe an unserer gewünschten Funktionalität, aber es wird komplizierter, wenn wir Details für mehr als ein Formularfeld anzeigen möchten. Da wir nur eine Toggle-Variable haben, ist das Anzeigen von Details ein Alles-oder-Nichts-Vorschlag. Entweder werden Details angezeigt alles der Felder oder für keines von ihnen.
Sie können dies beheben, indem Sie einen benutzerdefinierten Parameter an die Handlerfunktion übergeben.
Es ist möglich, benutzerdefinierte Parameter aus der Ansicht an den Ereignishandler zu übergeben. Das heißt, Sie können auf beliebige Informationen aus der Ansicht in das ViewModel zugreifen. In unserem Fall verwenden wir einen benutzerdefinierten Parameter, um zu ermitteln, in welchem Formularfeld die Details angezeigt werden sollen. Anstelle eines Umschalters wird der Einzelheiten
observable enthält einen String, der das ausgewählte Element darstellt. Zunächst nehmen wir einige geringfügige Änderungen am ViewModel vor:
this.details = ko.observable (""); this.showDetails = Funktion (Ziel, Ereignis, Details) this.details (Details); this.hideDetails = Funktion (Ziel, Ereignis) this.details ("");
Die einzige große Änderung hier ist der Zusatz von a Einzelheiten
Parameter an die zeige Details()
Methode. Wir benötigen keinen benutzerdefinierten Parameter für die hideDetails () - Funktion, da nur die beobachtbaren Details gelöscht werden.
Als Nächstes verwenden wir ein Funktionsliteral in der Veranstaltung
Bindung, um den benutzerdefinierten Parameter an showDetails () zu übergeben:
Das Funktionsliteral für Mouseover
ist eine Hülle für unsere zeige Details()
Handler, der eine einfache Möglichkeit bietet, zusätzliche Informationen zu übergeben. Der Mouseout-Handler bleibt unverändert. Schließlich müssen wir das aktualisieren mit den Details:
Dein Vorname
Das Vorname Das Formularfeld sollte seine detaillierte Beschreibung anzeigen, wenn Sie den Mauszeiger darüber bewegen, und ausblenden, wenn Sie den Mauszeiger verlassen, genau wie im vorherigen Abschnitt. Erst jetzt können Sie mehr als einem Feld Details hinzufügen, indem Sie den benutzerdefinierten Parameter ändern. Zum Beispiel können Sie Details für die aktivieren Nachname Eingabeelement mit:
Nachname: Dein Familienname
Event-Bindings können in der Einrichtung etwas kompliziert sein. Sobald Sie jedoch wissen, wie sie funktionieren, bieten sie unbegrenzte Möglichkeiten für reaktives Design. Das Veranstaltung
Die Bindung kann sich sogar mit der Animationsfunktionalität von jQuery verbinden, die in Lektion 8: behandelt wird. Für den Moment erkunden wir den Rest der interaktiven Bindungen von Knockout.js. Glücklicherweise ist keiner von ihnen fast so kompliziert wie Ereignisbindungen.
aktivieren deaktivieren
BindungenDas aktivieren
und deaktivieren
Bindungen können verwendet werden, um Formularfelder basierend auf bestimmten Bedingungen zu aktivieren oder zu deaktivieren. Angenommen, Sie wollten für jeden Benutzer eine primäre und eine sekundäre Telefonnummer aufzeichnen. Diese können als normale Observables auf PersonViewModel gespeichert werden:
this.primaryPhone = ko.observable (""); this.secondaryPhone = ko.observable ("");
Das primaryPhone-Observable kann mit einem Normalfeld mit einem Formularfeld verknüpft werden Wert
Bindung:
Haupttelefon:
Es macht jedoch keinen Sinn, eine sekundäre Telefonnummer einzugeben, ohne eine primäre anzugeben. Daher aktivieren wir die für die sekundäre Telefonnummer nur, wenn primaryPhone nicht leer ist:
Sekundäres Telefon:
Jetzt können Benutzer nur noch mit dem interagieren Sekundäres Telefon Feld, wenn sie einen Wert für eingegeben haben primaryPhone
. Das deaktivieren
Die Bindung ist eine bequeme Möglichkeit, die Bedingung zu negieren, funktioniert aber ansonsten genauso wie das Aktivieren.
geprüft
Bindunggeprüft
ist eine vielseitige Bindung, die je nach Verwendung unterschiedliche Verhaltensweisen aufweist. Im Allgemeinen wird die aktivierte Bindung verwendet, um die überprüfbaren Formularelemente von HTML-Elementen zu aktivieren bzw. deaktivieren: Kontrollkästchen und Optionsfelder.
Beginnen wir mit einem einfachen Kontrollkästchen:
Ärgere mich mit speziellen Angeboten:
Dadurch wird unserem Formular ein Kontrollkästchen hinzugefügt und es mit dem Formular verknüpft Nerv mich
Eigenschaft des ViewModel. Wie immer ist dies eine bidirektionale Verbindung. Wenn der Benutzer das Feld auswählt oder die Markierung aufhebt, aktualisiert Knockout.js das ViewModel. Wenn Sie den Wert der ViewModel-Eigenschaft festlegen, wird die Ansicht aktualisiert. Vergessen Sie nicht, die ärgerliche Beobachtung zu definieren:
this.annoyMe = ko.observable (true);
Verwendung der geprüft
Das Binden auf diese Art ist wie das Erstellen einer Eins-zu-Eins-Beziehung zwischen einem einzelnen Kontrollkästchen und einem beobachtbaren Booleschen Objekt.
Es ist auch möglich, die geprüft
Bindung mit Arrays. Wenn Sie ein Kontrollkästchen an ein beobachtbares Array binden, entsprechen die ausgewählten Boxen den im Array enthaltenen Elementen, wie in der folgenden Abbildung dargestellt:
Betrachten Sie zum Beispiel Folgendes:
this.annoyTimes = ko.observableArray (['Morgen', 'Abend']);
Wir können die Elemente in diesem beobachtbaren Array mit den Kontrollkästchen verbinden Wert
Attribut auf jedem Element:
Ärgere mich mit speziellen Angeboten:
Dies verwendet die
Abbildung 24: Kontrollkästchen, die den Anfangsstatus des anzeigenNerv mich
Eine Eigenschaft aus der vorherigen Lektion, um eine Liste von Kontrollkästchen umzuschalten, aus denen Sie auswählen können, wann es ein guter Zeitpunkt ist, um gestört zu werden. Schon seitWert = "Morgen"
Ist das erste Kontrollkästchen aktiviert, wird es jedes Mal aktiviert"Morgen"
Zeichenfolge ist im Array "annoyTimes". Dasselbe gilt für die anderen Kontrollkästchen. "Morgen" und "Abend" sind der anfängliche Inhalt des Arrays, daher sollten Sie etwa Folgendes auf Ihrer Webseite sehen:nervige Zeiten
beobachtbares ArrayUnd da benutzen wir eine beobachtbar Array ist die Verbindung in beide Richtungen. Wenn Sie die Auswahl aufheben, wird die entsprechende Zeichenfolge aus dem Feld entfernt
nervige Zeiten
Array.Radio Knöpfe
Der letzte Kontext für die
geprüft
Bindung ist in einer Optionsfeldgruppe. Anstelle eines booleschen Arrays oder eines Arrays verbinden Optionsfelder ihreWert
Attribut für eine Zeichenfolge-Eigenschaft im ViewModel. Zum Beispiel können wir unser Kontrollkästchen-Array in eine Optionsfeldgruppe umwandeln, indem wir zuerst die beobachtbare AnnoyTimes in eine Zeichenfolge ändern:this.annoyTimes = ko.observable ('Morgen');Dann müssen wir nur noch drehen
Elemente in Optionsfelder:
Jeder
Abbildung 25: Eine beobachtbare Zeichenfolge mit mehreren Optionsfeldern verbindensollte haben
"Radio"
als Typ und "AnnoyGroup" als Name. Letzteres hat nichts mit Knockout.js zu tun - es fügt einfach alle derselben HTML-Optionsfeldgruppe hinzu. Das Wertattribut des ausgewählten Optionsfelds wird jetzt immer in der Eigenschaft annoyTimes gespeichert.
Das
Optionen
BindungDas
Optionen
Bindung definiert den Inhalt von aElement. Dies kann in Form einer Dropdown-Liste oder einer Mehrfachauswahl-Liste erfolgen. Zuerst schauen wir uns die Dropdown-Listen an. Lassen Sie uns noch einmal die Eigenschaft annoyTimes bearbeiten:
this.annoyTimes = ko.observableArray (['Am Morgen', 'Am Nachmittag', 'Am Abend']);Dann können wir es an ein binden
Feld mit:
Sie sollten jetzt eine Dropdown-Liste anstelle einer Optionsfeldgruppe haben, aber es ist sinnlos, eine solche Liste zu haben, wenn Sie nicht herausfinden können, welches Element ausgewählt ist. Dafür können wir das wieder verwenden
Wert
verbindlich von früher in der Lektion:Dadurch wird festgelegt, welche Eigenschaft im ViewModel die ausgewählte Zeichenfolge enthält. Wir müssen diese Eigenschaft noch definieren:
this.selectedTime = ko.observable ('Am Nachmittag');Wieder geht diese Beziehung in beide Richtungen. Wert von einstellen
selectedTime
ändert das ausgewählte Element in der Dropdown-Liste und umgekehrt.Objekte als Optionen verwenden
Durch die Kombination der Optionen und der Wertebindungen erhalten Sie alle Werkzeuge, die Sie zum Arbeiten mit Dropdown-Listen benötigen, die Zeichenfolgen enthalten. Es ist jedoch oft viel praktischer, ganze JavaScript-Objekte mithilfe einer Dropdown-Liste auszuwählen. Im Folgenden wird beispielsweise eine Liste von Produkten definiert, die an die vorherige Lektion erinnern:
this.products = ko.observableArray ([Name: 'Bier', Preis: 10,99, Name: 'Gören', Preis: 7,99, Name: 'Brötchen', Preis: 2,99]);Wenn Sie versuchen, eine
Abbildung 26: Versuch, Objekte mit derElement davon werden alle Ihre Objekte als [Objekt Objekt] dargestellt:
Optionen
BindungGlücklicherweise können Sie mit Knockout.js eine
optionsText
Parameter, um die Objekteigenschaft zu definieren, die im gerendert werden sollDamit dieses Snippet funktioniert, müssen Sie auch ein definieren
favoriteProduct
beobachtbar auf Ihrem ViewModel. Knockout.js füllt diese Eigenschaft mit einem Objekt von PersonViewModel.products - keine Zeichenfolge wie im vorherigen Abschnitt.
Das
selectedOptions
BindungDie andere Darstellungsmöglichkeit für HTML's
Element ist eine Mehrfachauswahlliste. Das Konfigurieren einer Mehrfachauswahlliste ähnelt dem Erstellen einer Dropdown-Liste mit Ausnahme derjenigen ein ausgewähltes Element haben Sie eine Array von ausgewählten Elementen. Also anstatt ein
Wert
Bindung zum Speichern der Auswahl verwenden Sie die ausgewählteOptions-Bindung:Das
Größe
Attribut definiert die Anzahl der sichtbaren Optionen undmultiple = 'true'
verwandelt es in eine Mehrfachauswahlliste. FavoriteProducts sollte anstelle einer Zeichenfolge auf ein Array zeigen:var brats = name: 'brats', preis: 7.99; this.products = ko.observableArray ([Name: 'Bier', Preis: 10,99, Gören, Name: 'Brötchen', Preis: 2,99]); this.favoriteProducts = ko.observableArray ([Gören]);Beachten Sie, dass wir dieselbe Objektreferenz angeben mussten (
Gören
) an beideProdukte
und favoriteProducts für Knockout.js, um die Auswahl korrekt zu initialisieren.
Das
hasfocus
BindungUnd so kommen wir zu unserer abschließenden interaktiven Bindung:
hasfocus
. Mit dieser passend benannten Bindung können Sie den Fokus eines interaktiven Elements mithilfe einer ViewModel-Eigenschaft manuell festlegen. Wenn Sie aus irgendeinem merkwürdigen Grund möchten, dass das Feld "Primärtelefon" der ursprüngliche Fokus ist, können Sie eine hasfocus-Bindung hinzufügen, z.Haupttelefon:
Dann können Sie ein boolesches Observable hinzufügen, um Knockout.js mitzuteilen, dass es den Fokus erhält:
this.phoneHasFocus = ko.observable (true);Durch das Festlegen dieser Eigenschaft an anderer Stelle in Ihrer Anwendung können Sie den Fokusfluss in Ihren Formularen genau steuern. Darüber hinaus können Sie verwenden
hasfocus
um den Fortschritt des Benutzers durch mehrere Formularfelder zu verfolgen.
Zusammenfassung
In dieser Lektion wurden interaktive Bindungen behandelt, die die automatische Abhängigkeitsverfolgung von Knockout.js gegenüber den Formularfeldern von HTML nutzen. Im Gegensatz zu Aussehensbindungen sind interaktive Bindungen zwei wege Bindungsänderungen an den Benutzerschnittstellenkomponenten werden automatisch im ViewModel wiedergegeben, und Zuweisungen an ViewModel-Eigenschaften lösen Knockout.js aus, um die Ansicht entsprechend zu aktualisieren.
Interaktive Bindungen, Erscheinungsbindungen und Kontrollflussbindungen bilden das Vorlagen-Toolkit von Knockout.js. Ihr gemeinsames Ziel ist es, eine datenzentrierte Schnittstelle für Ihre Webanwendungen bereitzustellen. Wenn Sie die Darstellung Ihrer Daten mithilfe dieser Bindungen definiert haben, müssen Sie sich nur noch um das darunter liegende ViewModel kümmern. Dies ist eine wesentlich robustere Methode zur Entwicklung dynamischer Webanwendungen.
In dieser Lektion wurden Formulare aus Sicht der View und des ViewModel behandelt. Interaktive Bindungen sind eine intuitive, skalierbare Methode für den Zugriff auf Benutzereingaben. Wir müssen jedoch noch nicht besprechen, wie diese Daten aus dem Front-End und in ein serverseitiges Skript übertragen werden können. In der nächsten Lektion wird dieses Problem gelöst, indem Knockout.js in die AJAX-Funktionalität von jQuery integriert wird.
Diese Lektion repräsentiert ein Kapitel aus Knockout Prägnant, ein kostenloses eBook aus dem Team von Syncfusion.