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.

  • ๐Ÿ”— Toveisbinding: ng-model sender brukerinput til $scope-egenskapen og sender kontrollerendringer tilbake til kontrollen automatisk.
  • ๐Ÿ“ Tekstomrรฅdebinding: Bind en streng med flere linjer til et tekstomrรฅde og bruk \n escape-sekvensen for รฅ tvinge frem linjeskift i den gjengitte verdien.
  • โ˜‘๏ธ Avmerkingsboksstatus: En avmerkingsboks bundet med ng-model lagrer en boolsk verdi, sรฅ true gjengir boksen som avkrysset og false lar den vรฆre tom.
  • ???? Nedtrekkslister: Fyll et select-element med ng-alternativer og bind det valgte elementet til en separat modellengenskap.
  • โš ๏ธ Vanlig feil: Hvis du binder en select-verdi til det samme objektet som leverer alternativteksten, overskrives det objektet i den fรธrste select-verdien.
  • ๐Ÿ› ๏ธ Valideringskroker: ng-modellen legger til ng-urรธrte, ng-skitne, ng-gyldige og ng-ugyldige klasser som driver betinget styling og skjemasjekker.

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,

  1. Bindende kontroller som input, tekstomrรฅde og valg av elementer i visningen inn i modellen.
  2. Tilby en valideringsvirkemรฅte โ€“ for eksempel kan en validering legges til i en tekstboks slik at bare numeriske tegn kan skrives inn.
  3. 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.
  4. Viser den tilstanden som CSS-klasser. AngularJS legger til ng-pristine, ng-dirty, ng-valid og ng-invalid til 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:

  1. 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" og cols="50" attributter justerer ganske enkelt stรธrrelsen pรฅ kontrollen slik at teksten med flere linjer vises riktig.
  2. Medlemsvariabelen ยซpยปDescriptยซionยป tildeles en verdi pรฅ flere linjer. \n Escape-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:

  1. ng-model-direktivet knytter medlemsvariabelen ยซpnameยป til tekstinndatakontrollen, og egenskapene Topic.Controller og Topic.Models til de to avmerkingsbokskontrollene.
  2. 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 true gjengir boksen som avkrysset og false lar det vรฆre klart.

Utgang:

Fra utgangen,

  • Det kan tydelig sees at verdien som er tildelt pname variabelen 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 er false, 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:

  1. Tekstinputen er bundet til pName, og select-elementet er bundet til selectedTopicFordi select-funksjonen har sin egen modell-egenskap, forstyrrer det aldri selve listen รฅ velge et alternativ.
  2. Ocuco Topics Arrayet inneholder de to verdiene ยซKontrollerยป og ยซModellerยป. ng-options uttrykket bruker den matrisen og gjengir ett alternativ per oppfรธring, sรฅ det รฅ legge til et tredje emne krever ingen endring i markupen.
  3. selectedTopic er 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.

Spรธrsmรฅl og svar

ng-bind er enveis: den skriver ut en modellverdi i et element. ng-model er toveis og fungerer bare pรฅ skjemakontroller, slik at brukerinput flyter tilbake inn i modellen sรฅ vel som ut av den.

Legg til ng-model-options, for eksempel ng-model-options=โ€{ debounce: 500 }โ€. AngularJS venter deretter et halvt sekund etter siste tastetrykk fรธr modellen oppdateres, noe som er nyttig for sรธkebokser som utlรธser en forespรธrsel.

Stort sett, ja. AI-assistenter omskriver ng-modellen som [(ngModel)] og legger til FormsModule-importen. Reaktive skjemaer, tilpassede parsere og $formatters-pipelines trenger fortsatt manuell gjennomgang, fordi Angular modellerer dem veldig forskjellig.

AI-verktรธy sjekker de vanlige mistenkte raskt: en primitiv grense innenfor et underordnet omfang, et feilstavet kontrollernavn og en verdi tilordnet utenfor digest-syklusen. Hver av dem produserer en stille feil i stedet for en konsollfeil.

Bare input type="number" analyseres til en numerisk verdi. En type="text"-kontroll gir alltid en streng, sรฅ sammenligninger med === mislykkes. Konverter eksplisitt, eller bytt inputtype.

Oppsummer dette innlegget med: