Formelementer er den konvensjonelle måten å samhandle med brukere gjennom en nettside. Arbeide med skjemaer i Knockout.js er omtrent det samme som å jobbe med utseende bindinger. Men siden brukere kan redigere skjemafelt, administrerer Knockout.js oppdateringer i begge retninger. Dette betyr at interaktive bindinger er toveis. De kan settes programmatisk og visningen oppdateres tilsvarende, eller de kan settes av visningen og leses programmatisk.
Figur 19: Knockout.js forplantning endres i begge retningerFor eksempel kan du angi verdien av et tekstfelt fra ViewModel, og det vil bli vist i visningen. Men brukeren skriver noe i inntastingsfeltet fører til at den tilknyttede eiendommen på ViewModel oppdateres også. Poenget er, Knockout.js sørger alltid for at visningen og ViewModel er synkronisert.
Knockout.js inneholder 11 bindinger for samhandling med brukeren:
klikk
: verdi
: begivenhet
: sende inn
: Aktiver
: deaktivere
: sjekket
: opsjoner
:
element med et ViewModel-array.selectedOptions
:
felt.hasfocus
: Som utseendet bindinger presentert i den forrige leksjonen, er disse alle definert i data-bindingsattributtet til et HTML-element. Noen av dem (som klikk
bindende) arbeid på noe element, men andre (som sjekket) kan bare brukes med bestemte elementer.
En av de største fordelene med å bruke Knockout.js til å administrere HTML-skjemaer er det du fortsatt bare trenger å bekymre deg for dataene. Når brukeren endrer et formelements verdi, reflekterer ViewModel automatisk oppdateringen. Dette gjør det veldig enkelt å integrere brukerinngangene i resten av applikasjonen.
Denne leksjonen bruker en ny HTML-side for det kjørende eksemplet. I stedet for en handlekurvsvisningsside, jobber vi med et registreringsskjema for nye kunder. Opprett en ny HTML-fil kalt interaktiv-bindings.html
og legg til følgende:
Interaktive bindinger
Dette er en forenklet versjon av det vi har jobbet med i hele serien. I denne leksjonen vil vi bare være bekymret for konfigurering formelementer. Behandlingsskjemainnlegg er igjen for neste leksjon.
klikk
bindingKlikk bindingen er en av de enkleste interaktive bindingene. Det kaller bare en metode for ViewModel når brukeren klikker elementet. For eksempel, legg til følgende knapp innsiden av element:
Når brukeren klikker på knappen, kalles Knockout.js saveUserData ()
metode på PersonViewModel
. I tillegg går det to parametre til håndteringsmetoden: den nåværende modellen og DOM-hendelsen. En saveUserData () -metode som bruker begge disse parameterne, ser ut som om:
this.saveUserData = funksjon (modell, begivenhet) alert (model.firstName () + "prøver å sjekke ut!"); hvis (event.ctrlKey) alert ("Han holdt nede kontrolltasten av en eller annen grunn."); ;
I dette spesielle eksempelet, modell
refererer til den øverste ViewModel-forekomsten, og begivenhet
er DOM-hendelsen trigget av brukerens klikk. Modellen argumentet vil alltid være nåværende ViewModel, som gjør det mulig å få tilgang til individuelle listeposter i en foreach loop. Slik implementerte vi methoden removeProduct () i leksjon 3:.
verdi
bindingVerdibindingen er veldig lik den tekstbindingen vi har brukt gjennom hele denne serien. Hovedforskjellen er at den kan endres av bruker, og ViewModel vil oppdatere tilsvarende. For eksempel kan vi lenke fornavn
og etternavn
observables med et inputfelt ved å legge til følgende HTML i skjemaet (før
Fornavn:
Etternavn:
De verdi: firstName
bindende sørger for at Elementets tekst er alltid det samme som ViewModel's firstName-egenskap, uavhengig av om den er endret av brukeren eller av søknaden din. Det samme gjelder for LastName-egenskapen.
Vi kan undersøke dette ytterligere ved å inkludere en knapp for å vise brukerens navn og en annen for å sette den programmatisk. Dette lar oss se hvordan verdi
bindende verk fra begge ender:
Håndteringsmetodene skal se ut som følgende:
this.displayName = function () alert (this.firstName ()); ; this.setName = function () this.firstName ("Bob"); ;
Klikker Visningsnavn vil lese ViewModels fornavn
eiendom, som burde matche element, selv om det har blitt redigert av brukeren. De Angi navn knappen setter verdien av ViewModels eiendom, forårsaker element for å oppdatere. Oppførselen til sistnevnte er i hovedsak den samme som en normal tekstbinding.
Igjen, hele poenget bak denne toveissynkroniseringen er å la deg fokusere på dataene dine. Etter at du har satt opp en verdi
bindende, kan du helt glemme HTML-skjemaelementer. Bare få eller sett tilhørende eiendom på ViewModel og Knockout.js vil ta vare på resten.
Vi vil ikke trenge display
og setName-metoder eller deres respektive knapper, så du kan fortsette og slette dem hvis du vil.
begivenhet
bindingDe begivenhet
bindende lar deg lytte til vilkårlig DOM-hendelser på et hvilket som helst HTML-element. Det er som en generisk versjon av klikk
bindende. Men fordi det kan lytte etter flere hendelser, krever det et objekt å kartlegge hendelser til metoder (dette ligner attr-bindingsparameteren). For eksempel kan vi lytte til mouseover og mouseout hendelser på den første element med følgende:
Fornavn:
Når brukeren brenner a mus over
Hendelse, Knockout.js kaller Vis detaljer()
metode for vår ViewModel. På samme måte, når han eller hun forlater elementet, kalles hideDetails (). Begge disse tar de samme parameterne som klikkbindingens håndterer: målet for hendelsen og selve objektet. La oss implementere disse metodene nå:
this.showDetails = funksjon (mål, hendelse) alert ("Mouse over"); ; this.hideDetails = funksjon (mål, hendelse) alert ("Mouse out"); ;
Nå, når du samhandler med Fornavn feltet, bør du se begge meldingene dukker opp. Men i stedet for bare å vise en varselmelding, la oss vise litt ekstra informasjon for hvert skjemafelt når brukeren ruller over den. For dette trenger vi en annen observerbar på PersonViewModel
:
this.details = ko.observable (false);
De detaljer
Egenskapen fungerer som en bytte, som vi kan slå på og av med våre hendelseshåndteringsmetoder:
this.showDetails = funksjon (mål, hendelse) this.details (true); ; this.hideDetails = funksjon (mål, hendelse) this.details (false); ;
Da kan vi kombinere vekselen med synlig
bindende for å vise eller skjule skjemafeltdetaljer i visningen:
Fornavn: Ditt navn
Innholdet i bør vises når du musen over Fornavn feltet og forsvinner når du musen ut. Dette er ganske nært til ønsket funksjonalitet, men ting blir mer komplisert når vi vil vise detaljer for mer enn ett skjemafelt. Siden vi bare har en toggle-variabel, er det en all-or-nothing-proposisjon å vise detaljer, enten detaljer vises for alle av feltene, eller for ingen av dem.
En måte å løse dette på er å sende en tilpasset parameter til håndteringsfunksjonen.
Det er mulig å sende tilpassede parametere fra visningen til hendelseshandleren. Dette betyr at du kan få tilgang til vilkårlig informasjon fra visningen til ViewModel. I vårt tilfelle bruker vi en tilpasset parameter for å identifisere hvilket skjemafelt som skal vise detaljene. I stedet for en veksle, den detaljer
observerbar vil inneholde en streng som representerer det valgte elementet. Først vil vi gjøre noen små endringer i ViewModel:
this.details = ko.observable (""); this.showDetails = funksjon (mål, begivenhet, detaljer) this.details (detaljer); this.hideDetails = funksjon (mål, event) this.details ("");
Den eneste store forandringen her er tillegg av a detaljer
parameter til Vis detaljer()
metode. Vi trenger ikke en egendefinert parameter for funksjonen hideDetails () siden det bare fjerner detaljene som er observerbare.
Deretter bruker vi en funksjon bokstavelig i begivenhet
bindende for å sende den egendefinerte parameteren til showDetails ():
Funksjonen bokstavelig for mus over
er en wrapper for vår Vis detaljer()
handler, gir en enkel måte å passere i ekstra informasjon. Mouseout handler forblir uendret. Til slutt må vi oppdatere inneholder detaljene:
Ditt navn
De Fornavn skjemafelt skal vise sin detaljerte beskrivelse når du musen over og skjuler når du musen ut, akkurat som den gjorde i forrige seksjon. Bare nå, det er mulig å legge til detaljer i mer enn ett felt ved å endre den egendefinerte parameteren. For eksempel kan du aktivere detaljer for Etternavn Inndataelement med:
Etternavn: Ditt etternavn
Eventbinding kan være litt komplisert å sette opp, men når du forstår hvordan de fungerer, muliggjør de ubegrensede muligheter for reaktiv design. De begivenhet
bindende kan til og med koble til jQuery's animasjonsfunksjonalitet, som diskuteres i leksjon 8 :. For nå skal vi fullføre utforskningen av resten av Knockout.js interaktive bindinger. Heldigvis for oss er ingen av dem nesten like kompliserte som hendelsesbindinger.
på av
BindingerDe Aktiver
og deaktivere
bindinger kan brukes til å aktivere eller deaktivere skjemafelter basert på visse forhold. For eksempel, la oss si at du ønsket å ta opp et primært og et sekundært telefonnummer for hver bruker. Disse kan lagres som normale observables på PersonViewModel:
this.primaryPhone = ko.observable (""); this.secondaryPhone = ko.observable ("");
Den primærePhone observerbare kan kobles til et skjemafelt med en normal verdi
bindende:
Hoved telefon:
Det er imidlertid ikke fornuftig å skrive inn et sekundært telefonnummer uten å spesifisere en primær, så vi aktiverer for det sekundære telefonnummeret bare hvis primaryPhone ikke er tomt:
Sekundær telefon:
Nå vil brukerne kun kunne samhandle med Sekundær telefon feltet hvis de har oppgitt en verdi for Hoved telefon
. De deaktivere
bindende er en praktisk måte å negere på tilstanden, men ellers fungerer akkurat som aktivere.
sjekket
bindingsjekket
er en allsidig binding som utviser forskjellig atferd, avhengig av hvordan du bruker den. Generelt brukes den merkede bindingen til å velge og avmarkere HTML-kontrollerbare formelementer: avmerkingsbokser og radioknapper.
La oss starte med en enkel merketrute:
Angre meg med spesielle tilbud:
Dette legger til et avkrysningsboks i skjemaet og kobler det til irriter meg
egenskapen til ViewModel. Som alltid er dette en toveisforbindelse. Når brukeren velger eller avmarkerer boksen, oppdaterer Knockout.js ViewModel, og når du angir verdien av egenskapen ViewModel, oppdaterer den visningen. Ikke glem å definere annoyMe observerbar:
this.annoyMe = ko.observable (true);
Bruker sjekket
bindende på denne måten er som å skape et ett-til-ett forhold mellom en enkelt boks og en boolsk observerbar.
Det er også mulig å bruke sjekket
bindende med arrays. Når du binder en avmerkingsboks til et observerbart array, svarer de valgte boksene til elementene som finnes i arrayet, som vist i følgende figur:
For eksempel vurdere følgende observerbare:
this.annoyTimes = ko.observableArray (['morgen', 'kveld']);
Vi kan koble elementene i dette observerbare arrayet til boksene ved hjelp av verdi
attributt på hver element:
Angre meg med spesielle tilbud:
Dette bruker
Figur 24: Kryss av bokser som viser startstatusen tilirriter meg
eiendom fra forrige leksjon for å bytte en liste over boksene for å velge når det ville være en god tid å bli irritert. Sidenverdi = 'morgen'
er på den første avkrysningsboksen, vil den bli valgt når"morgen"
strengen er i annoyTimes array. Det samme gjelder for de andre boksene. "morgen" og "kveld" er det første innholdet i arrayet, så du bør se noe som følger på websiden din:annoyTimes
observerbar rekkefølgeOg siden vi bruker en observer array, forbindelsen er toveis-avvelger noen av boksene vil fjerne den tilsvarende strengen fra
annoyTimes
matrise.Radio knapper
Den siste konteksten for
sjekket
binding er i en radioknapp gruppe. I stedet for en boolsk eller en matrise, kobler radioknappene sineverdi
Tilordne en strengegenskap i ViewModel. For eksempel kan vi slå avmerkingsboksen til en radioknappgruppe ved først å endre annoyTimes observerbar til en streng:this.annoyTimes = ko.observable ('morning');Så, alt vi trenger å gjøre er å slå
elementer i radioknapper:
Hver
Figur 25: Koble til en observerbar streng med flere radioknapperburde
"radio"
som sin type og "annoyGroup" som sitt navn. Sistnevnte har ikke noe å gjøre med Knockout.js-det legger bare alle sammen til samme HTML-radioknappgruppe. Nå blir verdien til den valgte alternativknappen alltid lagret i annoyTimes-egenskapen.
De
opsjoner
bindingDe
opsjoner
bindende definerer innholdet i aelement. Dette kan ha formen av enten en rullegardinliste eller en flervalgsliste. Først tar vi en titt på rullegardinlister. La oss redigere annoyTimes-eiendommen enda en gang:
this.annoyTimes = ko.observableArray ('' om morgenen ',' om ettermiddagen ',' om kvelden ']);Da kan vi binde den til en
felt med:
Du bør nå ha en rullegardinliste i stedet for en radioknappgruppe, men det er ikke bruk å ha en slik liste hvis du ikke kan finne ut hvilket element som er valgt. For dette kan vi gjenbruke
verdi
bindende fra tidligere i leksjonen:Dette bestemmer hvilken egenskap på ViewModel inneholder den valgte strengen. Vi trenger fortsatt å definere denne egenskapen:
this.selectedTime = ko.observable ('På ettermiddagen');Igjen, dette forholdet går begge veier. Angir verdien av
selectedTime
vil endre det valgte elementet i rullegardinlisten, og omvendt.Bruk objekter som alternativer
Kombinere alternativene og verdien bindinger gir deg alle verktøyene du trenger for å arbeide med rullegardinlister som inneholder strenger. Men det er ofte mye enklere å velge hele JavaScript-objektene ved hjelp av en rullegardinliste. For eksempel definerer følgende en liste over produkter som minner om forrige leksjon:
this.products = ko.observableArray ([navn: 'Øl', pris: 10.99, navn: 'Brats', pris: 7.99, navn: 'Boller', pris: 2,99]);Når du prøver å lage en
Figur 26: Forsøk på å bruke objekter medelement ut av dette, vil alle gjenstandene dine bli gjengitt som [objektobjekt]:
opsjoner
bindendeHeldigvis lar Knockout.js deg passere en
optionsText
parameter for å definere objektegenskapen som skal gjengis iFor at denne utklippet skal fungere, må du også definere en
favoriteProduct
observerbar på ViewModel. Knockout.js vil fylle denne egenskapen med en gjenstand fra PersonViewModel.products-ikke en streng som den gjorde i forrige seksjon.
De
selectedOptions
bindingDen andre gjengivelsesmuligheten for HTML
elementet er en flervalgsliste. Konfigurere en flervalgsliste ligner på å lage en rullegardinliste, bortsett fra at i stedet for en valgt element, du har en matrise av utvalgte elementer. Så, i stedet for å bruke en
verdi
bindende for å lagre valget, bruker du valgtOptions binding:De
størrelse
Attributt definerer antall synlige alternativer, ogmultippel = 'sann'
gjør det til en flervalgsliste. I stedet for en strengegenskaper bør favorittProdukter vise til en matrise:var brats = navn: 'Brats', pris: 7.99; this.products = ko.observableArray ([navn: 'Øl', pris: 10.99, brats, navn: 'Boller', pris: 2,99]); this.favoriteProducts = ko.observableArray ([brats]);Merk at vi trengte å gi samme objektreferanse (
brats
) til beggeProdukter
og favorittProdukter for Knockout.js for å initialisere valget riktig.
De
hasfocus
bindingOg så kommer vi til vår endelige interaktive binding:
hasfocus
. Denne passende navnet bindingen lar deg manuelt sette fokus på et interaktivt element ved hjelp av en ViewModel-egenskap. Hvis du for en eller annen merkelig grunn vil at feltet "Primær telefon" skal være det første fokuset, kan du legge til en hasfokus-binding, slik som:Hoved telefon:
Deretter kan du legge til en boolsk observerbar å fortelle Knockout.js for å gi det fokus:
this.phoneHasFocus = ko.observable (true);Ved å sette denne eiendommen andre steder i søknaden din, kan du nøyaktig styre strømmen av fokus i skjemaene dine. I tillegg kan du bruke
hasfocus
å spore brukerens fremdrift gjennom flere skjemafelter.
Sammendrag
Denne leksjonen dekket interaktive bindinger, som utnytter Knockout.js 'automatisk avhengighetssporing mot HTMLs skjemafelter. I motsetning til utseende bindinger, er interaktive bindinger toveis bindinger - endringer i brukergrensesnittkomponentene blir automatisk reflektert i ViewModel, og oppgaver til ViewModel-egenskaper utløser Knockout.js for å oppdatere visningen tilsvarende.
Interaktive bindinger, utseende bindinger og kontroll-flyt bindinger komponere Knockout.js 'templerende verktøykasse. Deres felles mål er å gi et datasentrisk grensesnitt for dine webapplikasjoner. Når du definerer presentasjonen av dataene dine ved hjelp av disse bindingene, er alt du trenger å bekymre deg for å manipulere den underliggende ViewModel. Dette er en mye mer robust måte å utvikle dynamiske webapplikasjoner på.
Denne leksjonen diskuterte skjemaer fra perspektivet til visningen og ViewModel. Interaktive bindinger er en intuitiv, skalerbar metode for å få tilgang til brukerinngang, men vi har ennå ikke diskutert hvordan du får disse dataene ut av fronten og inn i et server-side script. Den neste leksjonen løser dette problemet ved å integrere Knockout.js med jQuery's AJAX-funksjonalitet.
Denne leksjonen representerer et kapittel fra Knockout Succinctly, en gratis eBok fra teamet på Syncfusion.