Az „ng-model” használata az AngularJS-ben a PÉLDÁK segítségével
⚡ Okos összefoglaló
Az AngularJS-ben lévő ng-model egy bemeneti vezérlőt közvetlenül a $scope egy tulajdonságához köt, keeping A nézet és a modell mindkét irányban szinkronizálva van. Az alábbi szakaszok az attribútumot, három működő példát és a kezdők által leggyakrabban elkövetett hibákat tárgyalják.

Mi az ng-model az AngularJS-ben?
Az ng-model egy AngularJS direktíva, amely a modellt reprezentálja, és elsődleges célja a „nézet” és a „modell” összekapcsolása. Bármit is ír be a felhasználó egy vezérlőbe, az egyenesen egy tulajdonságba íródik a $scope, és bármit is ír a vezérlő az adott tulajdonságba, az egyenesen visszakerül a vezérlőbe.
Tegyük fel például, hogy egy egyszerű oldalt szeretne megjeleníteni a végfelhasználónak, mint az alább látható, amely arra kéri a felhasználót, hogy adja meg a „Keresztnév” és a „Vezetéknév” adatokat szövegmezőkben. Ezután biztosítani szeretné, hogy a felhasználó által megadott információk tárolva legyenek az adatmodellben.
Az ng-model direktívával leképezheted a „Keresztnév” és a „Vezetéknév” szövegmezőit az adatmodelledhez. Az direktíva biztosítja, hogy a „nézet” és a „modell” adatai végig szinkronban legyenek, egyetlen sornyi eseménykezelő kód nélkül.
⚠️ Verzió megjegyzés: Az AngularJS (az 1.x ág) 2021. december 31-én elérte az élettartama végét, és már nem kap biztonsági javításokat. Az alábbi példák továbbra is futnak, de a modern Angularban ugyanaz a kétirányú kötés a következőképpen íródik: [(ngModel)] és megköveteli a FormsModule-t.
Az ng-modell attribútum
Amint azt a fenti szakaszban tárgyaltuk, az ng-model attribútum arra szolgál, hogy a modellben lévő adatokat a felhasználónak megjelenített nézettel kötjük.
Az ng-model attribútumot a következő esetekben használják:
- Vezérlőelemek, például beviteli mező, szövegmező és kijelölő elemek összekapcsolása a nézetben a modellel.
- Érvényesítési viselkedés biztosítása – például egy szövegmezőhöz hozzáadható egy érvényesítés, hogy csak numerikus karaktereket lehessen beírni.
- A vezérlő állapotának fenntartása. Állapot alatt azt értjük, hogy a vezérlő és az adatok mindig szinkronban vannak: ha az adatok értéke megváltozik, a vezérlőben lévő érték automatikusan megváltozik, és fordítva.
- CSS osztályokként megjelenítve ezt az állapotot. Az AngularJS hozzáadja
ng-pristine,ng-dirty,ng-validés ang-invalidminden ng-modellt hordozó vezérlőhöz, ami egyszerűvé teszi az űrlapok feltételes formázását.
Miután megértettük az attribútumot, a következő lépés az, hogy alkalmazzuk azt a három leggyakrabban előforduló vezérlési típusra.
Hogyan kell használni az ng-modellt
1) Szöveg terület
A szövegterület címke többsoros szövegbeviteli vezérlő meghatározására szolgál. A szövegterület korlátlan számú karaktert tartalmazhat, és a szöveg fix szélességű betűtípussal jelenik meg.
Most nézzünk egy egyszerű példát arra, hogyan adhatjuk hozzá az ng-model direktívát egy szövegmező-vezérlőhöz. Ebben a példában bemutatjuk, hogyan adhatunk át egy többsoros karakterláncot a vezérlőből a nézetbe, és hogyan rendelhetjük hozzá ezt az értéket a szövegmező-vezérlőhöz.
<!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 Magyarázat:
- Az ng-modell direktíva csatolja a „p” nevű tagváltozótDescription” a „textarea” vezérlőhöz. A „p”DescriptAz „ion” változó tartalmazza a szöveget, amelyet átadnak a szövegmező vezérlőjének.
rows="4"és acols="50"Az attribútumok egyszerűen úgy méretezik a vezérlőt, hogy a többsoros szöveg megfelelően jelenjen meg. - A „p” tagváltozóDescript„ion” egy többsoros értéket kap.
\nA karakterláncon belüli escape-szekvencia az, ami a szöveget a második sorba kényszeríti, amikor a textarea megjeleníti azt.
output:
A kimenetből egyértelműen látszik, hogy a vezérlőben hozzárendelt többsoros szöveg a szövegmező vezérlőjében jelenik meg, két sorra osztva, pontosan ott, ahol a \n ül.
2) Bemeneti elemek
Az ng-model direktíva hagyományos bemeneti elemekkel is működik. Az alábbiakban egy szövegdobozt és két jelölőnégyzetet kötünk össze egyszerre, így láthatjuk, hogyan kezeli az ng-model egymás mellett a karakterlánc-értéket és a logikai értéket.
<!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 Magyarázat:
- Az ng-model direktíva a „pname” tagváltozót a szövegbeviteli vezérlőhöz csatolja, és a tulajdonságokat
Topic.Controllerés aTopic.Modelsa két jelölőnégyzet-vezérlőhöz. - A vezérlőben a „pname” a következő karakterláncot kapja: „Guru99”, és a „Topic” objektum két logikai elemet kap. Az ng-model-lel kötött jelölőnégyzet mindig logikai értéket olvas és ír, ezért
truea négyzetet bejelöltként jeleníti meg, ésfalsetisztán hagyja.
output:
A kimenetből,
- Jól látható, hogy a hozzárendelt érték
pnameváltozó a „Guru99. " - Mivel az első korlát értéke
true, a „Vezérlő” jelölőnégyzet be van jelölve. Hasonlóképpen, mivel a második értékfalse, a „Modellek” jelölőnégyzet nincs bejelölve.
3) Válassza ki az elemet a legördülő menüből
Az ng-model direktíva a select elemre is alkalmazható, így a felhasználó által kiválasztott elem a modellben tárolódik.
Itt egy szöveges bemenetet fogunk látni, amely a következő nevet tartalmazza: „Guru99”, és egy két listaelemmel rendelkező kiválasztó lista: „Vezérlő” és „Modellek”.
⚠️ Javítás: A fenti képernyőkép az eredeti listát mutatja, amely a select elemet ugyanarra a listára kötötte. Topics objektum, amely a beállítási szöveget adta meg. Abban a pillanatban, amikor a felhasználó kiválaszt egy opciót, az AngularJS felülírja Topics a kiválasztott karakterlánccal, és mindkét opció eltűnik. Az alábbi javított lista a listát az egyik tulajdonságban, a kijelölést pedig egy másikban tartja, és a következőt használja: ng-options hogy felépítsem a listát.
<!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 Magyarázat:
- A szövegbevitel ehhez van kötve:
pName, és a select elem a következőhöz van kötve:selectedTopicMivel a select rendelkezik saját model tulajdonsággal, egy opció kiválasztása soha nem zavarja meg magát a listát. - Az
TopicsA tömb a két értéket tartalmazza: a „Controller” és a „Modells”.ng-optionsA kifejezés végigjárja a tömböt, és bejegyzésenként egy opciót jelenít meg, így egy harmadik témakör hozzáadása nem igényli a jelölés módosítását. selectedTopicaz első bejegyzésre van előre beállítva, ami miatt a legördülő menü értelmes alapértelmezés szerint nyílik meg egy üres sor helyett.
output:
A kimenetből látható, hogy a hozzárendelt érték a pName változó a „Guru99”, a kiválasztási vezérlő pedig a „Vezérlő” és a „Modellek” lehetőségeket kínálja fel. A működő példákon kívül a kötések néha megtagadják a frissítést, és érdemes tudni az okokat.
Miért hibásodnak meg néha az ng-modell kötések?
A legtöbb jelentett ng-modellprobléma nem az AngularJS hibája, hanem a hatókörök és primitívek működésének következménye.
A klasszikus eset egy olyan kötés, amelyet egy direktívába helyeznek, és amely egy gyermek hatókört hoz létre, például ng-ismétlés, ng-if vagy ng-switch. Írás ng-model="name" árnyékmásolatot hoz létre a gyermek hatókörén, így a szülő soha nem látja a szerkesztést. Ehelyett egy objektum tulajdonságához kötődik — ng-model="user.name" — minden hatókört ugyanarra a referenciára mutat. Ez az oka annak, hogy a tapasztalt AngularJS fejlesztők ragaszkodnak egy ponthoz minden ng-model kifejezésben.
A fennmaradó rész nagy részét további két ok magyarázza:
- Hiányzó vezérlő vagy modul: Ha az ng-app vagy az ng-controller paramétert helytelenül írták be, a kötés hibajelzés helyett csendben nem jelenít meg semmit.
- Az érték az AngularJS-en kívül változott: Egy jQuery kezelőből vagy setTimeout hívásból beállított érték a kivonatolási cikluson kívülre esik, így a nézet addig nem frissül, amíg
$scope.$apply()fut.
E három dolog ellenőrzése megoldja a látszólag nem működő kötések nagy részét.







