Formulierelementen zijn de conventionele manier om via een webpagina met gebruikers te communiceren. Het werken met formulieren in Knockout.js is ongeveer hetzelfde als werken met uiterlijk-bindingen. Maar aangezien gebruikers formuliervelden kunnen bewerken, beheert Knockout.js updates in beide richtingen. Dit betekent dat interactieve bindingen zijn tweezijdig. Ze kunnen programmatisch worden ingesteld en de weergave wordt dienovereenkomstig bijgewerkt, of ze kunnen door de weergave worden ingesteld en programmatisch worden gelezen.
Figuur 19: Knockout.js brengt veranderingen in beide richtingen voortU kunt bijvoorbeeld de waarde van een tekstinvoerveld instellen vanuit het ViewModel en dit wordt weergegeven in de weergave. Maar de gebruiker die iets in het invoerveld typt, zorgt ervoor dat de bijbehorende eigenschap op het ViewModel ook wordt bijgewerkt. Het punt is, Knockout.js zorgt er altijd voor dat de weergave en het ViewModel worden gesynchroniseerd.
Knockout.js bevat 11 bindingen voor interactie met de gebruiker:
Klik
: waarde
: evenement
: voorleggen
: in staat stellen
: onbruikbaar maken
: gecontroleerd
: opties
:
element met een ViewModel-array.selectedOptions
:
veld-.hasfocus
: Net als de uiterlijkbindingen die in de vorige les zijn gepresenteerd, zijn deze allemaal gedefinieerd in het kenmerk data-binding van een HTML-element. Sommigen van hen (zoals de Klik
binding) werken op elk element, maar andere (zoals gecontroleerd) kunnen alleen met specifieke elementen worden gebruikt.
Een van de belangrijkste voordelen van het gebruik van Knockout.js om HTML-formulieren te beheren, is dat jij nog steeds alleen zorgen te maken over de gegevens. Wanneer de gebruiker de waarde van een formulierelement wijzigt, geeft uw ViewModel de update automatisch weer. Dit maakt het zeer eenvoudig om gebruikersinvoer te integreren in de rest van uw applicatie.
In deze les wordt een nieuwe HTML-pagina gebruikt voor het actieve voorbeeld. In plaats van een weergavepagina van een winkelwagentje, werken we met een registratieformulier voor nieuwe klanten. Maak een nieuw HTML-bestand met de naam interactieve-bindings.html
en voeg het volgende toe:
Interactieve bindingen
Dit is een vereenvoudigde versie van waar we in de serie mee hebben gewerkt. In deze les maken we ons alleen zorgen over configureren vormelementen. Het verwerken van formulierinzendingen blijft staan voor de volgende les.
Klik
VerbindendDe klikbinding is een van de eenvoudigste interactieve bindingen. Het roept gewoon een methode van je ViewModel aan wanneer de gebruiker op het element klikt. Voeg bijvoorbeeld de volgende knop toe aan de binnenkant van de element:
Wanneer de gebruiker op de knop klikt, roept Knockout.js de saveUserData ()
methode op PersonViewModel
. Bovendien geeft het twee parameters door aan de handlermethode: het huidige model en de DOM-gebeurtenis. Een saveUserData () -methode die beide parameters gebruikt, ziet er ongeveer zo uit:
this.saveUserData = function (model, event) alert (model.firstName () + "probeert te betalen!"); if (event.ctrlKey) alert ("Hij hield de Control-toets om de een of andere reden ingedrukt."); ;
In dit specifieke voorbeeld, model-
verwijst naar de ViewModel-instantie op het hoogste niveau en evenement
is de DOM-gebeurtenis veroorzaakt door de klik van de gebruiker. Het modelargument is altijd de stroom ViewModel, waarmee het mogelijk is toegang te krijgen tot individuele lijstitems in een foreach-lus. Dit is hoe we de methode removeProduct () in Les 3 hebben geïmplementeerd:.
waarde
VerbindendDe waarde-binding lijkt sterk op de tekstbinding die we in deze serie hebben gebruikt. Het belangrijkste verschil is dat het kan worden gewijzigd door de gebruiker, en het ViewModel wordt dienovereenkomstig bijgewerkt. We kunnen bijvoorbeeld het Voornaam
en achternaam
observables met een invoerveld door de volgende HTML toe te voegen aan het formulier (vóór de
Voornaam:
Achternaam:
De waarde: firstName
binding zorgt ervoor dat de De tekst van het element is altijd hetzelfde als de eigenschap firstName van ViewModel, ongeacht of deze door de gebruiker of door uw toepassing is gewijzigd. Hetzelfde geldt voor de eigenschap lastName.
We kunnen dit verder onderzoeken door een knop op te nemen voor het weergeven van de naam van de gebruiker en een andere om hem programmatisch in te stellen. Dit laat ons zien hoe het waarde
bindende werken van beide kanten:
De behandelmethoden moeten er ongeveer als volgt uitzien:
this.displayName = function () alert (this.firstName ()); ; this.setName = function () this.firstName ("Bob"); ;
klikken Weergavenaam leest de ViewModel's Voornaam
eigenschap, die overeen zou moeten komen met de element, zelfs als het door de gebruiker is bewerkt. De Stel naam in knop stelt de waarde van de eigenschap ViewModel in, waardoor de element om bij te werken. Het gedrag van de laatste is in wezen hetzelfde als een normale tekstbinding.
Nogmaals, het hele punt achter deze synchronisatie in twee richtingen is om u te laten concentreren op uw gegevens. Nadat u een waarde
bindend, kunt u HTML-formulierelementen volledig vergeten. Gewoon de bijbehorende eigenschap ophalen of instellen op het ViewModel en Knockout.js verzorgt de rest.
We hebben de. Niet nodig Weergavenaam
en setName-methoden of de bijbehorende knoppen, zodat u ze kunt verwijderen en desgewenst kunt verwijderen.
evenement
VerbindendDe evenement
Met binding kunt u luisteren naar willekeurige DOM-gebeurtenissen op elk HTML-element. Het is als een generieke versie van de Klik
verbindend. Maar omdat het voor meerdere gebeurtenissen kan luisteren, heeft het een object nodig om gebeurtenissen aan werkwijzen toe te wijzen (dit is vergelijkbaar met de parameter attr binding). We kunnen bijvoorbeeld luisteren naar mouseover- en mouseout-gebeurtenissen op de eerste element met de volgende:
Voornaam:
Wanneer de gebruiker een a vuurt mouseover
evenement, Knockout.js noemt het toon details()
methode van ons ViewModel. Evenzo, als hij of zij het element verlaat, wordt hideDetails () aangeroepen. Beide hebben dezelfde parameters als de handlers van de click-binding: het doelwit van de gebeurtenis en het gebeurtenisobject zelf. Laten we deze methoden nu implementeren:
this.showDetails = functie (doel, gebeurtenis) alert ("Muis over"); ; this.hideDetails = function (target, event) alert ("Mouse out"); ;
Nu, wanneer u interactie hebt met de Voornaam veld, zou u beide berichten moeten zien verschijnen. Maar in plaats van alleen een waarschuwingsbericht weer te geven, laten we wat extra informatie zien voor elk formulierveld wanneer de gebruiker eroverheen rolt. Hiervoor hebben we nog een waarneming nodig PersonViewModel
:
this.details = ko.observable (false);
De gegevens
property fungeert als een toggle, die we kunnen in- en uitschakelen met onze event handler-methoden:
this.showDetails = function (target, event) this.details (true); ; this.hideDetails = function (target, event) this.details (false); ;
Dan kunnen we de schakelaar combineren met de zichtbaar
bindend om formuliervelddetails te tonen of te verbergen in de weergave:
Voornaam: Je voornaam
De inhoud van de moet verschijnen wanneer u met de muis over de Voornaam veld en verdwijnen wanneer je de muis eruit haalt. Dit komt vrij dicht in de buurt van onze gewenste functionaliteit, maar de zaken worden ingewikkelder zodra we details voor meer dan één formulierveld willen weergeven. Omdat we maar één toggle-variabele hebben, is het weergeven van details een alles-of-niets-propositie - waarvoor details worden weergegeven allemaal van de velden, of voor geen van hen.
Een manier om dit te verhelpen is door een aangepaste parameter door te geven aan de handlerfunctie.
Het is mogelijk om aangepaste parameters uit de weergave door te geven aan de gebeurtenishandler. Dit betekent dat u vanuit het beeld willekeurige informatie kunt openen in het ViewModel. In ons geval gebruiken we een aangepaste parameter om aan te geven in welk formulierveld de details moeten worden weergegeven. In plaats van een schakelaar, de gegevens
waarneembaar bevat een tekenreeks die het geselecteerde element vertegenwoordigt. Eerst maken we een paar kleine wijzigingen in het ViewModel:
this.details = ko.observable (""); this.showDetails = function (target, event, details) this.details (details); this.hideDetails = function (target, event) this.details ("");
De enige grote verandering hier is de toevoeging van a gegevens
parameter naar de toon details()
methode. We hebben geen aangepaste parameter nodig voor de functie hideDetails (), omdat alleen de details zichtbaar worden gemaakt.
Vervolgens gebruiken we een letterlijke functie in de evenement
binding om de aangepaste parameter door te geven aan showDetails ():
De functie letterlijk voor mouseover
is een verpakking voor ons toon details()
handler, een eenvoudig middel om extra informatie door te geven. De mouseout-handler blijft ongewijzigd. Ten slotte moeten we het met de details:
Je voornaam
De Voornaam in het formulierveld moet de gedetailleerde beschrijving worden weergegeven wanneer u de muisaanwijzer plaatst en verbergt wanneer u de muis eruit haalt, net zoals in het vorige gedeelte. Alleen nu is het mogelijk om details toe te voegen aan meer dan één veld door de aangepaste parameter te wijzigen. U kunt bijvoorbeeld details voor de Achternaam invoerelement met:
Achternaam: Jouw achternaam
Gebeurtenisbindingen kunnen een beetje ingewikkeld zijn om in te stellen, maar als je eenmaal begrijpt hoe ze werken, bieden ze onbegrensde mogelijkheden voor reactief ontwerpen. De evenement
binding kan zelfs verbinding maken met de animatiefunctionaliteit van jQuery, die wordt besproken in les 8 :. Voor nu zullen we de rest van de interactieve bindingen van Knockout.js voltooien. Gelukkig voor ons is geen van hen bijna net zo ingewikkeld als het binden van gebeurtenissen.
/ uit te schakelen
BindingenDe in staat stellen
en onbruikbaar maken
bindingen kunnen worden gebruikt om formuliervelden in of uit te schakelen op basis van bepaalde voorwaarden. Stel dat u bijvoorbeeld een primair en een secundair telefoonnummer voor elke gebruiker wilde opnemen. Deze kunnen worden opgeslagen als normale waarneembare gegevens op PersonViewModel:
this.primaryPhone = ko.observable (""); this.secondaryPhone = ko.observable ("");
De observeerbare primaryPhone kan worden gekoppeld aan een formulierveld met een normaal waarde
verbindend:
Vaste telefoon:
Het heeft echter weinig zin om een secundair telefoonnummer in te voeren zonder een primair telefoonnummer op te geven, dus we activeren het alleen voor het secundaire telefoonnummer als de primaire telefoon niet leeg is:
Secundaire telefoon:
Gebruikers kunnen nu alleen communiceren met de Secundaire telefoon veld als ze een waarde hebben ingevoerd voor Vaste telefoon
. De onbruikbaar maken
binding is een handige manier om de conditie te ontkennen, maar werkt verder precies zoals inschakelen.
gecontroleerd
Verbindendgecontroleerd
is een veelzijdige binding die verschillende gedragingen vertoont, afhankelijk van hoe je het gebruikt. Over het algemeen wordt de gecontroleerde binding gebruikt om HTML's te selecteren en te de-selecteren: selectievakjes en keuzerondjes.
Laten we beginnen met een eenvoudig selectievakje:
Annoy me met speciale aanbiedingen:
Dit voegt een selectievakje toe aan ons formulier en koppelt het aan het annoyMe
eigendom van het ViewModel. Zoals altijd is dit een tweerichtingsverbinding. Wanneer de gebruiker de box selecteert of deselecteert, werkt Knockout.js het ViewModel bij en wanneer u de waarde van de ViewModel-eigenschap instelt, wordt de weergave bijgewerkt. Vergeet niet om de annoyMe waarneembaar te definiëren:
this.annoyMe = ko.observable (true);
De ... gebruiken gecontroleerd
binding op deze manier is als het creëren van een één-op-één-relatie tussen een enkel selectievakje en een Booleaanse waarneembare.
Het is ook mogelijk om de. Te gebruiken gecontroleerd
binden met arrays. Wanneer u een selectievakje aan een waarneembare array koppelt, komen de geselecteerde vakken overeen met elementen in de array, zoals weergegeven in de volgende afbeelding:
Beschouw bijvoorbeeld het volgende waarneembaar:
this.annoyTimes = ko.observableArray (['morning', 'evening']);
We kunnen de items in deze waarneembare array verbinden met selectievakjes met behulp van de waarde
attribuut op elk element:
Annoy me met speciale aanbiedingen:
Dit gebruikt de
Afbeelding 24: Selectievakjes die de begintoestand van de server weergevenannoyMe
eigenschap uit de vorige les om een lijst met selectievakjes in te schakelen om te selecteren wanneer het een goed moment zou zijn om geïrriteerd te zijn. Sindsvalue = 's morgens'
bevindt zich bij het eerste selectievakje, deze wordt telkens wanneer geselecteerd"ochtend"
string bevindt zich in de array annoyTimes. Hetzelfde geldt voor de andere selectievakjes. "morning" en "evening" zijn de initiële inhoud van de array, dus u zou iets als het volgende in uw webpagina moeten zien:annoyTimes
waarneembare arrayEn omdat we een gebruiken waarneembaar array, de verbinding is tweerichtings-deselecterend, een van de vakken zal de corresponderende string verwijderen uit de
annoyTimes
rangschikking.Radio knoppen
De laatste context voor de
gecontroleerd
binding bevindt zich in een groep met keuzerondjes. In plaats van een Boolean of een array, verbinden de radioknoppen hunwaarde
attribuut aan een tekenreekseigenschap in het ViewModel. We kunnen bijvoorbeeld onze check-box array veranderen in een groep keuzerondjes door eerst de waarneembare annoyTimes in een string te veranderen:this.annoyTimes = ko.observable ('morning');Alles wat we moeten doen is dan de
elementen in keuzerondjes:
Elk
Figuur 25: Een waarneembare string verbinden met meerdere keuzerondjeszou moeten hebben
"radio"
als zijn type en "annoyGroup" als zijn naam. De laatste heeft niets te maken met Knockout.js - het voegt ze allemaal toe aan dezelfde groep HTML-radioknoppen. Nu wordt het waardekenmerk van het geselecteerde keuzerondje altijd opgeslagen in de eigenschap annoyTimes.
De
opties
VerbindendDe
opties
binding definieert de inhoud van aelement. Dit kan de vorm hebben van een vervolgkeuzelijst of een lijst met meerdere selecties. Eerst zullen we de vervolgkeuzelijsten bekijken. Laten we de eigenschap annoyTimes nog een keer bewerken:
this.annoyTimes = ko.observableArray (['s morgens', 's middags', 's avonds']);Dan kunnen we het binden aan een
veld met:
U zou nu een vervolgkeuzelijst moeten hebben in plaats van een keuzerondjesgroep, maar het heeft geen zin om zo'n lijst te hebben als u niet kunt achterhalen welk item is geselecteerd. Hiervoor kunnen we het
waarde
binding van eerder in de les:Dit bepaalt welke eigenschap op het ViewModel de geselecteerde reeks bevat. We moeten deze eigenschap nog steeds definiëren:
this.selectedTime = ko.observable ('In the afternoon');Nogmaals, deze relatie is in beide richtingen. De waarde van instellen
selectedTime
zal het geselecteerde item in de vervolgkeuzelijst wijzigen en omgekeerd.Objecten gebruiken als opties
Het combineren van de opties en de waardebindingen geeft u alle hulpmiddelen die u nodig hebt om te werken met vervolgkeuzelijsten die strings bevatten. Het is echter vaak handiger om volledige JavaScript-objecten te selecteren met behulp van een vervolgkeuzelijst. Het volgende definieert bijvoorbeeld een lijst met producten die doen denken aan de vorige les:
this.products = ko.observableArray ([name: 'Beer', prijs: 10.99, naam: 'Brats', prijs: 7.99, naam: 'Buns', prijs: 2.99]);Wanneer u probeert een te maken
Figuur 26: Poging om objecten te gebruiken met deelement hiervan zullen al uw objecten worden weergegeven als [object Object]:
opties
verbindendGelukkig laat Knockout.js je een
optionsText
parameter om de objecteigenschap te definiëren in deOm dit fragment te laten werken, moet u ook een definiëren
favoriteProduct
waarneembaar op uw ViewModel. Knockout.js zal deze eigenschap vullen met een voorwerp van PersonViewModel.products, geen tekenreeks zoals in de vorige sectie.
De
selectedOptions
VerbindendDe andere weergavemogelijkheid voor HTML's
element is een multi-select-lijst. Het configureren van een multi-select-lijst lijkt veel op het maken van een vervolgkeuzelijst, behalve dat in plaats van een geselecteerde item, hebt u een rangschikking van geselecteerde items. Dus in plaats van een
waarde
bindend om de selectie op te slaan, gebruikt u de binding selectedOptions:De
grootte
attribuut definieert het aantal zichtbare opties, enmeervoudige = 'true'
verandert het in een multi-select-lijst. In plaats van een tekenreekseigenschap moeten favoriete producten verwijzen naar een array:var brats = name: 'Brats', prijs: 7.99; this.products = ko.observableArray ([name: 'Beer', prijs: 10.99, brats, name: 'Buns', prijs: 2.99]); this.favoriteProducts = ko.observableArray ([brats]);Merk op dat we dezelfde objectreferentie moesten opgeven (
snotapen
) aan beideproducten
en favorieteProducten voor Knockout.js om de selectie correct te initialiseren.
De
hasfocus
VerbindendEn zo komen we bij onze laatste interactieve binding:
hasfocus
. Met deze toepasselijk benoemde binding kunt u handmatig de focus van een interactief element instellen met behulp van een ViewModel-eigenschap. Als u om een of andere rare reden wilt dat het veld 'Primaire telefoon' de eerste focus is, kunt u een hasfocus-binding toevoegen, zoals:Vaste telefoon:
Dan kun je een Booleaanse waarneming toevoegen om Knockout.js te vertellen om het te focussen:
this.phoneHasFocus = ko.observable (true);Door deze eigenschap ergens anders in uw toepassing in te stellen, kunt u nauwkeurig de stroom van focus in uw formulieren regelen. Bovendien kunt u gebruiken
hasfocus
om de voortgang van de gebruiker bij te houden door middel van meerdere formuliervelden.
Samenvatting
Deze les ging over interactieve bindingen, die gebruikmaken van de automatische afhankelijkheidscontrole van Knockout.js op de formuliervelden van HTML. Anders dan uiterlijk bindingen, interactieve bindingen zijn tweezijdig bindings-wijzigingen in de componenten van de gebruikersinterface worden automatisch weergegeven in het ViewModel, en toewijzingen aan ViewModel-eigenschappen activeren Knockout.js om de weergave dienovereenkomstig bij te werken.
Interactieve bindingen, uiterlijk bindingen en controle-flow bindingen vormen Knockout.js 'templating toolkit. Hun gemeenschappelijke doel is om een datacentrische interface te bieden voor uw webapplicaties. Zodra u de presentatie van uw gegevens met behulp van deze bindingen definieert, hoeft u zich alleen zorgen te maken over het manipuleren van het onderliggende ViewModel. Dit is een veel robuustere manier om dynamische webtoepassingen te ontwikkelen.
In deze les werden vormen besproken vanuit het perspectief van het beeld en het ViewModel. Interactieve bindingen zijn een intuïtieve, schaalbare methode voor toegang tot gebruikersinvoer, maar we moeten nog bespreken hoe deze gegevens uit de front-end en in een server-side script kunnen worden gehaald. In de volgende les wordt dit probleem verholpen door Knockout.js te integreren met de AJAX-functionaliteit van jQuery.
Deze les vertegenwoordigt een hoofdstuk van Knockout bondig, een gratis eBoek van het team van Syncfusion.