Formelement är det vanliga sättet att interagera med användare via en webbsida. Att arbeta med formulär i Knockout.js är ungefär detsamma som att arbeta med utseendebindningar. Men eftersom användare kan redigera formulärfält hanterar Knockout.js uppdateringar i båda riktningarna. Detta innebär att interaktiva bindningar är tvåvägs. De kan ställas in programmatiskt och vyn uppdateras i enlighet med detta, eller De kan ställas in av vyn och läsa programmatiskt.
Figur 19: Knockout.js förökar ändringar i båda riktningarnaDu kan till exempel ställa in värdet på ett textfält från ViewModel och det visas i vyn. Men användaren som skriver något i inmatningsfältet gör att den tillhörande egenskapen på ViewModel uppdateras också. Poängen är att Knockout.js alltid ser till att vyn och ViewModel synkroniseras.
Knockout.js innehåller 11 bindningar för att interagera med användaren:
klick
: värde
: händelse
: lämna
: Gör det möjligt
: inaktivera
: kontrollerade
: alternativ
:
element med en ViewModel array.selectedOptions
:
fält.hasfocus
: Liksom de utseendebindningar som presenterades i den tidigare lektionen definieras alla dessa i ett bindningsattribut för ett HTML-element. Några av dem (som klick
bindande) arbete på något element, men andra (som kontrollerat) kan endast användas med specifika element.
En av de största fördelarna med att använda Knockout.js för att hantera HTML-formulär är det du fortfarande behöver bara oroa sig för data. När användaren ändrar ett formelements värde, reflekterar din ViewModel automatiskt uppdateringen. Det gör det väldigt lätt att integrera användarinmatning i resten av din ansökan.
Denna lektion använder en ny HTML-sida för det körande exemplet. I stället för en kundvagnssida visas vi med ett registreringsformulär för nya kunder. Skapa en ny HTML-fil som heter interaktiva-bindings.html
och lägg till följande:
Interaktiva bindningar
Detta är en förenklad version av vad vi har arbetat med i hela serien. I den här lektionen kommer vi bara att oroa oss konfigurering formelement. Behandling av formulärinsändningar lämnas till nästa lektion.
klick
BindningKlickbindningen är en av de enklaste interaktiva bindningarna. Det ringer bara en metod för din ViewModel när användaren klickar på elementet. Till exempel lägg till följande knapp inuti element:
När användaren klickar på knappen, kallar Knockout.js saveUserData ()
metod på PersonViewModel
. Dessutom skickas det två parametrar till hanteringsmetoden: den aktuella modellen och DOM-händelsen. En saveUserData () metod som använder båda dessa parametrar skulle se ut som:
this.saveUserData = funktion (modell, händelse) alert (model.firstName () + "försöker checka ut!"); om (event.ctrlKey) alert ("Han höll ner kontrollnyckeln av någon anledning."); ;
I detta speciella exempel, modell
refererar till den översta ViewModel-förekomsten, och händelse
är DOM-händelsen trigget av användarens klick. Modellen argumentet kommer alltid att vara nuvarande ViewModel, som gör det möjligt att få tillgång till enskilda listobjekt i en förloppsling. Så här genomförde vi metoden removeProduct () i lektion 3:.
värde
BindningVärdebindningen är mycket lik den textbindning vi har använt genom hela denna serie. Den viktigaste skillnaden är att den kan ändras av användare, och ViewModel uppdateras i enlighet med detta. Till exempel kan vi länka förnamn
och efternamn
observerbarhet med ett inmatningsfält genom att lägga till följande HTML i formuläret (före
Förnamn:
Efternamn:
De värde: firstName
bindande säkerställer att Elementets text är alltid densamma som ViewModels firstName-egenskap, oavsett om den har ändrats av användaren eller av din ansökan. Detsamma gäller för egenskapen LastName.
Vi kan undersöka detta ytterligare genom att inkludera en knapp för att visa användarens namn och en annan för att ställa in det på ett programmatiskt sätt. Detta låter oss se hur värde
bindande verk från båda ändar:
Hanteringsmetoderna ska se ut som följande:
this.displayName = function () alert (this.firstName ()); ; this.setName = function () this.firstName ("Bob"); ;
klick Visningsnamn kommer att läsa ViewModels förnamn
egendom som borde matcha element, även om den har redigerats av användaren. De Ange namn knappen ställer in värdet på ViewModels egenskap, vilket orsakar element för att uppdatera. Beteendet hos sistnämnda är väsentligen detsamma som en normal textbindning.
Återigen är hela poängen bakom denna tvåvägssynkronisering att du ska kunna fokusera på dina data. När du har ställt in en värde
bindande, kan du helt glömma HTML-formelement. Hämta eller sätt bara den tillhörande egenskapen på ViewModel och Knockout.js tar hand om resten.
Vi kommer inte behöva display
och setName-metoder eller deras respektive knappar, så du kan fortsätta och radera dem om du vill.
händelse
BindningDe händelse
bindande låter dig lyssna på godtyckliga DOM-händelser på något HTML-element. Det är som en generisk version av klick
bindning. Men eftersom det kan lyssna på flera händelser, krävs det ett syfte att kartlägga händelser till metoder (detta liknar attr-bindningsparametern). Till exempel kan vi lyssna på mouseover och mouseout händelser på den första element med följande:
Förnamn:
När användaren brinner a mouseover
händelse, kallar Knockout.js visa detaljer()
Metoden för vår ViewModel. På samma sätt när han eller hon lämnar elementet kallas hideDetails (). Båda dessa har samma parametrar som klickbindarens hanterare: målet för händelsen och händelseobjektet självt. Låt oss genomföra dessa metoder nu:
this.showDetails = funktion (mål, händelse) alert ("Mouse over"); ; this.hideDetails = funktion (mål, händelse) alert ("Mouse out"); ;
Nu när du interagerar med Förnamn fält bör du se båda meddelandena dyka upp. Men istället för att bara visa ett varningsmeddelande, låt oss visa lite extra information för varje formulärfält när användaren rullar över det. För detta behöver vi en annan observerbar på PersonViewModel
:
this.details = ko.observable (false);
De detaljer
egendom fungerar som en växel, som vi kan slå på och av med våra händelsehanteringsmetoder:
this.showDetails = funktion (mål, händelse) this.details (true); ; this.hideDetails = funktion (mål, händelse) this.details (false); ;
Då kan vi kombinera växeln med synlig
bindande för att visa eller dölja formulärfältets detaljer i vyn:
Förnamn: Ditt förnamn
Innehållet i ska visas när du musen över Förnamn fält och försvinna när du musen ut. Detta ligger ganska nära vår önskade funktionalitet, men saker blir mer komplicerade när vi vill visa detaljer för mer än ett formulärfält. Eftersom vi bara har en växelvariabel, är det en all-or-nothing-proposition som visar detaljer, antingen detaljer visas för Allt av fälten, eller för ingen av dem.
Ett sätt att åtgärda detta är genom att skicka en anpassad parameter till handlarfunktionen.
Det är möjligt att skicka anpassade parametrar från vyn i händelsehanteraren. Det betyder att du kan få tillgång till godtycklig information från vyn i ViewModel. I vårt fall använder vi en anpassad parameter för att identifiera vilket formulärfält som ska visa informationen. I stället för en växel, den detaljer
observerbar kommer att innehålla en sträng som representerar det valda elementet. Först gör vi några små förändringar i ViewModel:
this.details = ko.observable (""); this.showDetails = funktion (mål, händelse, detaljer) this.details (detaljer); this.hideDetails = funktion (mål, händelse) this.details ("");
Den enda stora förändringen här är tillägget av a detaljer
parameter till visa detaljer()
metod. Vi behöver inte en anpassad parameter för funktionen hideDetails () eftersom det bara rensar detaljerna observerbara.
Därefter använder vi en funktion bokstavlig i händelse
bindande för att skicka den anpassade parametern till showDetails ():
Funktionen bokstavlig för mouseover
är en omslag för vår visa detaljer()
handler, vilket ger ett enkelt sätt att passera i extra information. Mouseout-handlaren förblir oförändrad. Slutligen måste vi uppdatera innehåller detaljerna:
Ditt förnamn
De Förnamn Formfältet ska visa sin detaljerade beskrivning när du musen över och döljer när du musen ut, precis som den gjorde i föregående avsnitt. Endast nu är det möjligt att lägga till detaljer i mer än ett fält genom att ändra den anpassade parametern. Till exempel kan du aktivera detaljer för Efternamn inmatningselement med:
Efternamn: Ditt efternamn
Eventbindningar kan vara lite komplicerade att sätta upp, men när du förstår hur de fungerar möjliggör de obegränsade möjligheter för reaktiv design. De händelse
bindning kan till och med ansluta till jQuerys animationsfunktionalitet, vilket diskuteras i lektion 8 :. För nu slutar vi utforska resten av Knockout.js interaktiva bindningar. Lyckligtvis för oss är ingen av dem nästan lika komplicerade som händelsebindningar.
aktivera inaktivera
BindningarDe Gör det möjligt
och inaktivera
bindningar kan användas för att aktivera eller inaktivera formulärfält baserat på vissa villkor. Låt oss till exempel säga att du ville spela in ett primärt och ett sekundärt telefonnummer för varje användare. Dessa kan lagras som normala observables på PersonViewModel:
this.primaryPhone = ko.observable (""); this.secondaryPhone = ko.observable ("");
PrimaryPhone-observerbara kan kopplas till ett formulärfält med en normal värde
bindning:
Primär Telefon:
Det är dock inte så mycket meningsfullt att ange ett sekundärt telefonnummer utan att ange en primär, så vi aktiverar endast för sekundärt telefonnummer om primaryPhone inte är tomt:
Sekundär telefon:
Nu kan användarna bara kunna interagera med Sekundär telefon fält om de har angett ett värde för Primär Telefon
. De inaktivera
bindning är ett bekvämt sätt att negera tillståndet, men fungerar annars precis som möjligt.
kontrollerade
Bindningkontrollerade
är en mångsidig bindning som uppvisar olika beteenden beroende på hur du använder den. I allmänhet används den markerade bindningen för att markera och avmarkera HTML: s kontrollbara formulärelement: kryssrutor och radioknappar.
Låt oss börja med en enkel kryssruta:
Ångra mig med specialerbjudanden:
Detta lägger till en kryssruta i vår formulär och länkar den till irritera mig
egenskapen hos ViewModel. Som alltid är det en tvåvägsanslutning. När användaren väljer eller avmarkerar rutan uppdaterar Knockout.js ViewModel, och när du anger värdet för ViewModel-egenskapen uppdaterar den vyn. Glöm inte att definiera annoyMe observerbar:
this.annoyMe = ko.observable (true);
Använda kontrollerade
bindande på detta sätt är som att skapa ett ett-till-ett förhållande mellan en enda kryssruta och en booleska observerbar.
Det är också möjligt att använda kontrollerade
bindande med arrays. När du binder en kryssruta till en observerbar grupp motsvarar de valda rutorna elementen i arrayen, som visas i följande bild:
Tänk på följande observerbara:
this.annoyTimes = ko.observableArray (['morning', 'evening']);
Vi kan koppla objekten i denna observerbara array till kryssrutor med hjälp av värde
attribut på varje element:
Ångra mig med specialerbjudanden:
Detta använder
Figur 24: Kryssrutor som visar startläget förirritera mig
egendom från föregående lektion för att byta en lista med kryssrutor för att välja när det skulle vara en bra tid att vara irriterad. Eftersomvalue = 'morgon'
är på den första kryssrutan kommer den att väljas när"morgon"
strängen ligger i annoyTimes-arrayen. Detsamma gäller för de andra kryssrutorna. "morgon" och "kväll" är de ursprungliga innehållen i arrayen, så du borde se något på följande sätt på din webbsida:annoyTimes
observerbar arrayOch eftersom vi använder en märkbar array, anslutningen är tvåvägs-avmarkera någon av rutorna tar bort motsvarande sträng från
annoyTimes
array.Radioknappar
Det sista sammanhanget för
kontrollerade
bindning finns i en radioknappgrupp. I stället för en booleska eller en array, kopplar radioknappar derasvärde
attribut till en strängegenskap i ViewModel. Till exempel kan vi vrida rutan i rutan till en radioknappgrupp genom att först ändra annoyTimes observerbara för en sträng:this.annoyTimes = ko.observable ('morning');Då är allt vi behöver göra att vända
element i radioknappar:
Varje
Figur 25: Ansluta en observerbar sträng med flera radioknapparborde ha
"radio"
som dess typ och "annoyGroup" som sitt namn. Den senare har ingenting att göra med Knockout.js-det lägger bara till dem alla till samma HTML-radioknappgrupp. Nu lagras värdet attributet för den valda alternativknappen alltid i egenskapen annoyTimes.
De
alternativ
BindningDe
alternativ
bindande definierar innehållet i aelement. Detta kan ha formen av antingen en rullgardinslista eller en flervalslista. Först ska vi titta på listrutorna. Låt oss redigera annoyTimes-egenskapen en gång till:
this.annoyTimes = ko.observableArray (['På morgonen', 'På eftermiddagen', 'På kvällen']);Då kan vi binda den till en
fält med:
Du borde nu ha en rullgardinsmeny istället för en radioknappgrupp, men det är inte användbart att ha en sådan lista om du inte kan ta reda på vilket objekt som är valt. För detta kan vi återanvända
värde
bindande från tidigare i lektionen:Detta bestämmer vilken egenskap på ViewModel som innehåller den valda strängen. Vi behöver fortfarande definiera den här egenskapen:
this.selectedTime = ko.observable ('På eftermiddagen');Återigen går detta förhållande på båda hållen. Ställ in värdet på
selectedTime
kommer att ändra det valda objektet i rullgardinslistan och vice versa.Använda objekt som alternativ
Kombinera alternativen och värdet bindningar ger dig alla verktyg du behöver för att arbeta med listrutor som innehåller strängar. Men det är ofta mycket bekvämare att välja hela JavaScript-objekt med hjälp av en rullgardinslista. Till exempel definierar följande en lista över produkter som påminner om föregående lektion:
this.products = ko.observableArray ([namn: "Öl", pris: 10.99, namn: "Brats", pris: 7.99, namn: "Bullar", pris: 2,99]);När du försöker skapa en
Figur 26: Försök att använda objekt medelement ur detta kommer alla dina objekt att bli gjorda som [objektobjekt]:
alternativ
bindningLyckligtvis låter Knockout.js dig passera en
optionsText
parameter för att definiera objektegenskapen att göra iFör att detta utdrag ska fungera måste du också definiera en
favoriteProduct
observerbar på din ViewModel. Knockout.js kommer att fylla den här egenskapen med en objekt från PersonViewModel.products-inte en sträng som den gjorde i föregående avsnitt.
De
selectedOptions
BindningDen andra återgivningsmöjligheten för HTML: s
elementet är en flervalslista. Konfigurera en flervalslista är ungefär som att skapa en rullgardinslista, förutom att istället för ett valda objekt, du har en array av valda objekt. Så, istället för att använda a
värde
bindande för att lagra valet, använder du de valda Objekten bindande:De
storlek
attribut definierar antalet synliga alternativ, ochmultipel = 'true'
gör det till en flervalslista. I stället för en strängegenskap bör favoritprodukter peka på en array:var brats = namn: 'Brats', pris: 7,99; this.products = ko.observableArray ([namn: "öl", pris: 10.99, brats, namn: "bullar", pris: 2,99]); this.favoriteProducts = ko.observableArray ([brats]);Observera att vi behövde tillhandahålla samma objektreferens (
brats
) Till bådaProdukter
och favoriteProducts för Knockout.js för att initiera valet korrekt.
De
hasfocus
BindningOch så kommer vi till vår slutliga interaktiva bindning:
hasfocus
. Med den här namnet bindande kan du manuellt ställa in fokus för ett interaktivt element med en ViewModel-egenskap. Om du av någon märklig anledning vill att fältet "Primär telefon" är det första fokuset, kan du lägga till en hasfocus-bindning, som så:Primär Telefon:
Då kan du lägga till en Boolean observerbar för att berätta Knockout.js för att ge den fokus:
this.phoneHasFocus = ko.observable (true);Genom att ställa in den här egenskapen någon annanstans i din ansökan kan du exakt styra flödet av fokus i dina formulär. Dessutom kan du använda
hasfocus
för att spåra användarens framsteg genom flera formulärfält.
Sammanfattning
Denna lektion omfattade interaktiva bindningar, vilket utnyttjar Knockout.js automatiska beroendeuppföljning mot HTML-formulärfälten. Till skillnad från utseende bindningar är interaktiva bindningar tvåvägs bindningar-ändringar i användargränssnittskomponenterna återspeglas automatiskt i ViewModel, och uppdrag till ViewModel-egenskaper utlöser Knockout.js för att uppdatera vyn i enlighet med detta..
Interaktiva bindningar, utseendebindningar och kontrollflödesbindningar komponerar Knockout.js 'templerande verktygsverktyg. Deras gemensamma mål är att tillhandahålla ett datacentrisk gränssnitt för dina webbapplikationer. När du har definierat presentationen av dina data med dessa bindningar är allt du behöver oroa dig för att manipulera den underliggande ViewModel. Detta är ett mycket mer robust sätt att utveckla dynamiska webbapplikationer.
I denna lektion diskuterades formulär ur perspektivet av vyn och ViewModel. Interaktiva bindningar är en intuitiv, skalbar metod för åtkomst till användarinmatning, men vi har ännu inte diskuterat hur man får dessa data ut från fronten och till ett serverns script. Nästa lektion tar upp problemet genom att integrera Knockout.js med jQuerys AJAX-funktionalitet.
Denna lektion representerar ett kapitel från Knockout Succinctly, en gratis eBook från laget på Syncfusion.