Hvordan bruke "ng-modell" i AngularJS med EKSEMPLER
โก Smart oppsummering
ng-modellen i AngularJS binder en inputkontroll direkte til en egenskap pรฅ $scope, keeping visningen og modellen synkronisert i begge retninger. Avsnittene nedenfor dekker attributtet, tre fungerende eksempler og feilene nybegynnere stรธter pรฅ oftest.

Hva er ng-modell i AngularJS?
ng-model er et direktiv i AngularJS som representerer modellen, og hovedformรฅlet er รฅ binde ยซviewetยป til ยซmodellenยป. Alt brukeren skriver inn i en kontroll skrives direkte inn i en egenskap pรฅ $scope, og det kontrolleren skriver til den egenskapen, sendes rett tilbake til kontrollen.
La oss for eksempel si at du รธnsker รฅ presentere en enkel side for sluttbrukeren, som den som er vist nedenfor, der brukeren blir bedt om รฅ skrive inn ยซFornavnยป og ยซEtternavnยป i tekstbokser. Deretter รธnsker du รฅ sรธrge for at du lagrer informasjonen brukeren har lagt inn i datamodellen din.
Du kan bruke ng-model-direktivet til รฅ tilordne tekstboksfeltene ยซFornavnยป og ยซEtternavnยป til datamodellen din. Direktivet vil sรธrge for at dataene i ยซvisningenยป og dataene i ยซmodellenยป din holdes synkroniserte hele tiden, uten en eneste linje med hendelseshรฅndteringskode.
โ ๏ธ Versjonsmerknad: AngularJS (1.x-grenen) nรฅdde slutten av sin levetid 31. desember 2021 og mottar ikke lenger sikkerhetsoppdateringer. Eksemplene nedenfor kjรธrer fortsatt, men i moderne Angular skrives den samme toveisbindingen som [(ngModel)] og krever FormsModule.
ng-modellens attributt
Som omtalt i avsnittet ovenfor, brukes ng-model-attributtet til รฅ binde dataene i modellen din til visningen som presenteres for brukeren.
ng-modellattributtet brukes til,
- Bindende kontroller som input, tekstomrรฅde og valg av elementer i visningen inn i modellen.
- Tilby en valideringsvirkemรฅte โ for eksempel kan en validering legges til i en tekstboks slik at bare numeriske tegn kan skrives inn.
- Opprettholde kontrollens tilstand. Med tilstand mener vi at kontrollen og dataene alltid holdes synkroniserte: hvis verdien av dataene endres, endres verdien i kontrollen automatisk, og omvendt.
- Viser den tilstanden som CSS-klasser. AngularJS legger til
ng-pristine,ng-dirty,ng-validogng-invalidtil hver kontroll som har en ng-modell, noe som gjรธr betinget styling av skjemaer enkel.
Nรฅr attributtet er forstรฅtt, er neste trinn รฅ bruke det pรฅ de tre kontrolltypene du vil mรธte oftest.
Hvordan bruke ng-modellen
1) Tekstomrรฅde
Tekstomrรฅde-taggen brukes til รฅ definere en flerlinjers tekstinntastingskontroll. Tekstomrรฅdet kan inneholde et ubegrenset antall tegn, og teksten gjengis i en skrift med fast bredde.
La oss nรฅ se pรฅ et enkelt eksempel pรฅ hvordan vi kan legge til ng-model-direktivet i en tekstomrรฅdekontroll. I dette eksemplet รธnsker vi รฅ vise hvordan vi kan sende en flerlinjestreng fra kontrolleren til visningen og knytte den verdien til tekstomrรฅdekontrollen.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> <script src="https://code.angularjs.org/1.8.3/angular.js"></script> </head> <body> <h1>Guru99 Global Event</h1> <div ng-app="DemoApp" ng-controller="DemoCtrl"> <form> Topic Description:<br><br> <textarea rows="4" cols="50" ng-model="pDescription"></textarea> </form> </div> <script> var app = angular.module('DemoApp', []); app.controller('DemoCtrl', function($scope) { $scope.pDescription = "This topic looks at how Angular JS works \nModels in Angular JS"; }); </script> </body> </html>
Code Forklaring:
- Ocuco ng-modell direktiv legger til medlemsvariabelen kalt ยซpยปDescriptionยป til ยซtextareaยป-kontrollen. ยซpยปDescriptVariabelen ยซionยป inneholder teksten som sendes videre til tekstomrรฅdekontrollen.
rows="4"ogcols="50"attributter justerer ganske enkelt stรธrrelsen pรฅ kontrollen slik at teksten med flere linjer vises riktig. - Medlemsvariabelen ยซpยปDescriptยซionยป tildeles en verdi pรฅ flere linjer.
\nEscape-sekvensen inne i strengen er det som tvinger teksten over pรฅ en andre linje nรฅr textarea gjengir den.
Utgang:
Fra utdataene er det tydelig at den flerlinjede teksten som er tilordnet i kontrolleren vises i tekstomrรฅdekontrollen, delt over to linjer nรธyaktig der \n sitter.
2) Inndataelementer
ng-model-direktivet fungerer ogsรฅ med vanlige input-elementer. Nedenfor binder vi en tekstboks og to avmerkingsbokser samtidig, slik at du kan se hvordan ng-model hรฅndterer en strengverdi og en boolsk verdi side om side.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> <script src="https://code.angularjs.org/1.8.3/angular.js"></script> </head> <body> <h1>Guru99 Global Event</h1> <div ng-app="DemoApp" ng-controller="DemoCtrl"> <form> Topic Description:<br><br> Name : <input type="text" ng-model="pname"><br> Topic :<br> <input type="checkbox" ng-model="Topic.Controller">Controller<br> <input type="checkbox" ng-model="Topic.Models">Models </form> </div> <script> var app = angular.module('DemoApp', []); app.controller('DemoCtrl', function($scope) { $scope.pname = "Guru99"; $scope.Topic = { Controller: true, Models: false }; }); </script> </body> </html>
Code Forklaring:
- ng-model-direktivet knytter medlemsvariabelen ยซpnameยป til tekstinndatakontrollen, og egenskapene
Topic.ControllerogTopic.Modelstil de to avmerkingsbokskontrollene. - I kontrolleren fรฅr ยซpnameยป strengen ยซGuru99ยป, og ยซTopicยป-objektet fรฅr to boolske medlemmer. En avmerkingsboks bundet med ng-model leser og skriver alltid en boolsk verdi, og det er derfor
truegjengir boksen som avkrysset ogfalselar det vรฆre klart.
Utgang:
Fra utgangen,
- Det kan tydelig sees at verdien som er tildelt
pnamevariabelen er ยซGuru99. " - Siden den fรธrste bundne verdien er
true, er avmerkingsboksen merket av for avmerkingsboksen ยซKontrollerยป. Pรฅ samme mรฅte, siden den andre verdien erfalse, er ikke avmerkingsboksen for ยซModellerยป.
3) Velg element fra rullegardinmenyen
ng-model-direktivet kan ogsรฅ brukes pรฅ select-elementet, slik at elementet brukeren velger lagres i modellen.
Her vil vi ha en tekstinndata som inneholder navnet ยซGuru99ยป, og en valgliste med to listeelementer, ยซKontrollerยป og ยซModellerยป.
โ ๏ธ Rettelse: Skjermbildet ovenfor viser den opprinnelige oppfรธringen, som bandt select-elementet til det samme Topics objektet som leverte alternativteksten. I det รธyeblikket en bruker velger et alternativ, overskriver AngularJS Topics med den valgte strengen, og begge alternativene forsvinner. Den korrigerte oppfรธringen nedenfor beholder listen i รฉn egenskap og valget i en annen, og bruker ng-options รฅ bygge listen.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> <script src="https://code.angularjs.org/1.8.3/angular.js"></script> </head> <body> <h1>Guru99 Global Event</h1> <div ng-app="DemoApp" ng-controller="DemoCtrl"> <form> Topic Description:<br><br> Name : <input type="text" ng-model="pName"><br> Topic :<br> <!-- Topics holds the list; selectedTopic holds the choice --> <select ng-model="selectedTopic" ng-options="t for t in Topics"></select> </form> </div> <script> var app = angular.module('DemoApp', []); app.controller('DemoCtrl', function($scope) { $scope.pName = "Guru99"; $scope.Topics = ["Controller", "Models"]; $scope.selectedTopic = $scope.Topics[0]; }); </script> </body> </html>
Code Forklaring:
- Tekstinputen er bundet til
pName, og select-elementet er bundet tilselectedTopicFordi select-funksjonen har sin egen modell-egenskap, forstyrrer det aldri selve listen รฅ velge et alternativ. - Ocuco
TopicsArrayet inneholder de to verdiene ยซKontrollerยป og ยซModellerยป.ng-optionsuttrykket bruker den matrisen og gjengir ett alternativ per oppfรธring, sรฅ det รฅ legge til et tredje emne krever ingen endring i markupen. selectedTopicer forhรฅndsinnstilt til den fรธrste oppfรธringen, som er det som gjรธr at rullegardinmenyen รฅpnes med en fornuftig standard i stedet for en tom rad.
Utgang:
Fra utdataene kan man se at verdien som er tilordnet til pName variabelen er ยซGuru99ยป, og select-kontrollen tilbyr alternativene ยซControllerยป og ยซModelsยป. Bortsett fra arbeidseksempler, nekter bindinger noen ganger รฅ oppdatere, og รฅrsakene er verdt รฅ vite.
Hvorfor ng-modellbindinger noen ganger mislykkes
De fleste rapporterte ng-modellproblemene er ikke feil i AngularJS, men konsekvenser av hvordan omfang og primitiver fungerer.
Det klassiske tilfellet er en binding plassert inne i et direktiv som oppretter et underordnet omfang, for eksempel ng-gjenta, ng-if eller ng-switch. Skriving ng-model="name" der opprettes en skyggekopi pรฅ det underordnede omfanget, slik at den overordnede aldri ser redigeringen. Binding til en egenskap til et objekt i stedet โ ng-model="user.name" โ sรธrger for at alle omfang peker mot samme referanse. Dette er grunnen til at erfarne AngularJS-utviklere insisterer pรฅ en prikk i alle ng-modelluttrykk.
To ytterligere รฅrsaker stรฅr for mesteparten av resten:
- Mangler kontroller eller modul: Hvis ng-app eller ng-controller er feilstavet, gjengir bindingen ingenting i stille grad i stedet for รฅ generere en feil.
- Verdi endret utenfor AngularJS: Et verdisett fra en jQuery-hรฅndterer eller et setTimeout-tilbakekall lander utenfor digest-syklusen, slik at visningen ikke oppdateres fรธr
$scope.$apply()runs.
ร sjekke disse tre tingene lรธser de aller fleste bindinger som ser ut til รฅ ikke fungere.







