Kuinka käyttää "ng-mallia" AngularJS:ssä ESIMERKKEJÄ
⚡ Älykäs yhteenveto
AngularJS:n ng-malli sitoo syöteohjausobjektin suoraan $scope-ominaisuuteen, keeping Näkymä ja malli synkronoitu molempiin suuntiin. Alla olevat osiot käsittelevät ominaisuutta, kolmea toimivaa esimerkkiä ja aloittelijoiden useimmin kohtaamia virheitä.

Mikä on ng-malli AngularJS:ssä?
ng-model on AngularJS:n direktiivi, joka edustaa mallia, ja sen ensisijainen tarkoitus on sitoa "näkymä" "malliin". Kaikki, mitä käyttäjä kirjoittaa ohjausobjektiin, kirjoitetaan suoraan ominaisuuteen $scope, ja kaikki, mitä ohjain kirjoittaa kyseiseen ominaisuuteen, lähetetään suoraan takaisin ohjaukseen.
Oletetaan esimerkiksi, että haluat esitellä loppukäyttäjälle yksinkertaisen sivun, kuten alla olevan kuvan mukainen, jossa käyttäjää pyydetään syöttämään "Etunimi" ja "Sukunimi" tekstiruutuihin. Ja sitten haluat varmistaa, että tallennat käyttäjän syöttämät tiedot tietomalliisi.
Voit käyttää ng-model-direktiiviä yhdistääksesi "Etunimi"- ja "Sukunimi"-tekstiruutukentät tietomalliisi. Direktiivi varmistaa, että "näkymän" ja "mallisi" tiedot pysyvät synkronoituina koko ajan ilman riviäkään tapahtumienkäsittelykoodia.
⚠️ Versiohuomautus: AngularJS (1.x-haara) saavutti elinkaarensa lopun 31. joulukuuta 2021, eikä se enää saa tietoturvapäivityksiä. Alla olevat esimerkit toimivat edelleen, mutta nykyaikaisessa Angularissa sama kaksisuuntainen sidonta kirjoitetaan muodossa [(ngModel)] ja vaatii FormsModule-moduulin.
ng-mallin ominaisuus
Kuten yllä olevassa osiossa käsiteltiin, ng-model-attribuuttia käytetään mallisi tietojen sitomiseen käyttäjälle esitettyyn näkymään.
Attribuuttia ng-model käytetään
- Näkymän syöttö-, tekstialue- ja valintaelementtien sitominen malliin.
- Vahvistustoiminnon tarjoaminen – esimerkiksi tekstiruutuun voidaan lisätä vahvistus, jotta vain numeerisia merkkejä voidaan syöttää.
- Kontrollin tilan ylläpitäminen. Tilalla tarkoitamme, että kontrolli ja data pidetään aina synkronoituna: jos datan arvo muuttuu, kontrollin arvo muuttuu automaattisesti ja päinvastoin.
- Tuon tilan paljastaminen CSS-luokkina. AngularJS lisää
ng-pristine,ng-dirty,ng-validjang-invalidjokaiselle ng-mallia sisältävälle ohjausobjektille, mikä tekee lomakkeiden ehdollisen muotoilun yksinkertaiseksi.
Kun ominaisuus on ymmärretty, seuraava vaihe on soveltaa sitä kolmeen useimmin tapaamaasi ohjaustyyppiin.
Kuinka käyttää ng-mallia
1) Tekstialue
Tekstialueen tunnistetta käytetään monirivisen tekstinsyötön ohjauksen määrittämiseen. Tekstialueelle mahtuu rajoittamaton määrä merkkejä, ja teksti hahmonnetaan kiinteäleveällä fontilla.
Katsotaanpa nyt yksinkertaista esimerkkiä siitä, kuinka voimme lisätä ng-model-direktiivin tekstialueen ohjausobjektiin. Tässä esimerkissä haluamme näyttää, kuinka voimme välittää monirivisen merkkijonon ohjausobjektista näkymään ja liittää kyseisen arvon tekstialueen ohjausobjektiin.
<!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 Selitys:
- ng-mallin direktiivi liittää jäsenmuuttujan nimeltä ”p”Description” tekstialueen ohjausobjektiin. ”p”Description”-muuttuja sisältää tekstin, joka välitetään tekstialueen ohjaukseen.
rows="4"jacols="50"attribuutit yksinkertaisesti muuttavat ohjausobjektin kokoa niin, että monirivinen teksti näkyy oikein. - Jäsenmuuttuja ”pDescription” -komennolle annetaan monirivinen arvo.
\nMerkkijonon sisällä oleva koodinvaihtomerkkijono pakottaa tekstin toiselle riville, kun tekstialue renderöi sen.
lähtö:
Tulosteesta on selvää, että ohjaimeen määritetty monirivinen teksti näkyy tekstialueen ohjauksessa jaettuna kahdelle riville täsmälleen siinä kohdassa, missä \n istuu.
2) Syöttöelementit
ng-model-direktiivi toimii myös tavallisten syöttöelementtien kanssa. Alla sidomme tekstiruudun ja kaksi valintaruutua samanaikaisesti, joten näet, miten ng-model käsittelee merkkijonoarvon ja totuusarvon rinnakkain.
<!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 Selitys:
- ng-model-direktiivi liittää jäsenmuuttujan ”pname” tekstinsyöttöelementtiin ja ominaisuudet
Topic.ControllerjaTopic.Modelskahteen valintaruutuun. - Ohjaimessa ”pname”:lle annetaan merkkijono ”Guru99”, ja ”Topic”-objektille annetaan kaksi totuusarvon jäsentä. ng-model-funktiolla sidottu valintaruutu lukee ja kirjoittaa aina totuusarvon, minkä vuoksi
truerenderöi ruudun valituksi jafalsejättää sen selväksi.
lähtö:
Ulostulosta,
- Voidaan selvästi nähdä, että sille annettu arvo
pnamemuuttuja on "Guru99. " - Koska ensimmäinen rajattu arvo on
true, valintaruutu ”Ohjain”-valintaruutua varten on merkitty. Samoin, koska toinen arvo onfalse, ”Mallit”-valintaruutua ei ole valittu.
3) Valitse elementti pudotusvalikosta
ng-model-direktiiviä voidaan soveltaa myös select-elementtiin, jolloin käyttäjän valitsema kohde tallennetaan malliin.
Tässä meillä on tekstisyöttö, jossa on nimi "Guru99”, ja valintaluettelo, jossa on kaksi luettelokohtaa: ”Ohjain” ja ”Mallit”.
⚠️ Korjaus: Yllä olevassa kuvakaappauksessa näkyy alkuperäinen listaus, joka sitoi valintaelementin täsmälleen samaan Topics objekti, joka antoi vaihtoehdon tekstin. Heti kun käyttäjä valitsee vaihtoehdon, AngularJS korvaa Topics valitulla merkkijonolla ja molemmat vaihtoehdot katoavat. Alla oleva korjattu lista pitää listan yhdessä ominaisuudessa ja valinnan toisessa ja käyttää ng-options listan rakentamiseksi.
<!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 Selitys:
- Tekstisyöttö on sidottu
pName, ja valintaelementti on sidottuselectedTopicKoska select-funktiolla on oma malliominaisuus, vaihtoehdon valitseminen ei koskaan muuta itse listaa. -
Topicstaulukko sisältää kaksi arvoa: ”Controller” ja ”Models”.ng-optionslauseke käy läpi taulukon ja renderöi yhden vaihtoehdon merkintää kohden, joten kolmannen aiheen lisääminen ei vaadi muutoksia merkintään. selectedTopicon esiasetettu ensimmäiseen merkintään, minkä vuoksi alasvetovalikko avautuu järkevällä oletusarvolla tyhjän rivin sijaan.
lähtö:
Tulosteesta voidaan nähdä, että annettu arvo pName muuttuja on "Guru99”, ja valintaohjausobjekti tarjoaa vaihtoehdot ”Ohjain” ja ”Mallit”. Käytännön esimerkkejä lukuun ottamatta sidokset joskus kieltäytyvät päivittymästä, ja syyt tähän ovat syytä tietää.
Miksi ng-mallin sidokset joskus epäonnistuvat
Useimmat raportoidut ng-mallin ongelmat eivät ole AngularJS:n bugeja, vaan seurauksia siitä, miten osiopalkit ja primitiivit toimivat.
Klassinen tapaus on sidonta, joka sijoitetaan direktiivin sisään ja luo alilaajuuden, kuten ng-toista, ng-if tai ng-switch. Kirjoittaminen ng-model="name" luo varjokopion alikohteeseen, joten vanhempi ei koskaan näe muokkausta. Sidotaan sen sijaan objektin ominaisuuteen — ng-model="user.name" — pitää jokaisen oskilloskoopin osoittamassa samaan referenssiin. Tästä syystä kokeneet AngularJS-kehittäjät vaativat pistettä jokaisessa ng-mallin lausekkeessa.
Kaksi muuta syytä selittävät suurimman osan lopusta:
- Puuttuva ohjain tai moduuli: Jos ng-app tai ng-controller on kirjoitettu väärin, sidonta ei renderöi mitään hiljaa virheen aiheuttamisen sijaan.
- Arvo muuttui AngularJS:n ulkopuolella: jQuery-käsittelijän tai setTimeout-kutsun asettama arvo päätyy tiivistesyklin ulkopuolelle, joten näkymä ei päivity ennen kuin
$scope.$apply()kulkee.
Näiden kolmen asian tarkistaminen ratkaisee suurimman osan toimimattomista sidonnaisuuksista.







