Come utilizzare "ng-model" in AngularJS con ESEMPI
โก Riepilogo intelligente
ng-model in AngularJS collega un controllo di input direttamente a una proprietร su $scope, mantieniping La vista e il modello sono sincronizzati in entrambe le direzioni. Le sezioni seguenti illustrano l'attributo, tre esempi pratici e gli errori piรน comuni commessi dai principianti.

Cos'รจ il modello ng in AngularJS?
ng-model รจ una direttiva in AngularJS che rappresenta il modello e il suo scopo principale รจ quello di collegare la "vista" al "modello". Qualunque cosa l'utente digiti in un controllo viene scritta direttamente in una proprietร su $scopee qualsiasi cosa il controller scriva in quella proprietร viene immediatamente rimandata al controllo.
Ad esempio, supponiamo di voler presentare all'utente finale una semplice pagina come quella mostrata di seguito, che chiede all'utente di inserire "Nome" e "Cognome" in appositi campi di testo. Successivamente, vorremmo assicurarci di memorizzare le informazioni inserite dall'utente nel nostro modello dati.
ร possibile utilizzare la direttiva ng-model per mappare i campi di testo "Nome" e "Cognome" al modello dati. La direttiva garantirร che i dati nella "vista" e quelli del "modello" rimangano sempre sincronizzati, senza bisogno di scrivere una sola riga di codice per la gestione degli eventi.
โ ๏ธ Nota sulla versione: AngularJS (il ramo 1.x) ha raggiunto la fine del suo ciclo di vita il 31 dicembre 2021 e non riceve piรน patch di sicurezza. Gli esempi seguenti funzionano ancora, ma nell'Angular moderno lo stesso binding bidirezionale รจ scritto come [(ngModel)] e richiede il modulo FormsModule.
L'attributo del modello ng
Come discusso nella sezione precedente, l'attributo ng-model viene utilizzato per collegare i dati del modello alla vista presentata all'utente.
L'attributo ng-model viene utilizzato per,
- Collegamento di controlli quali input, area di testo ed elementi di selezione nella vista al modello.
- Implementare un comportamento di validazione: ad esempio, รจ possibile aggiungere una validazione a una casella di testo in modo che siano ammessi solo caratteri numerici.
- Mantenimento dello stato del controllo. Per stato si intende che il controllo e i dati sono sempre mantenuti sincronizzati: se il valore dei dati cambia, il valore nel controllo cambia automaticamente e viceversa.
- Esporre quello stato come classi CSS. AngularJS aggiunge
ng-pristine,ng-dirty,ng-validandng-invalidad ogni controllo che trasporta un ng-model, ed รจ questo che semplifica la stilizzazione condizionale dei moduli.
Una volta compreso l'attributo, il passo successivo รจ applicarlo ai tre tipi di controllo che incontrerete piรน frequentemente.
Come utilizzare il modello ng
1) Area di testo
Il tag dell'area di testo viene utilizzato per definire un controllo di input di testo su piรน righe. L'area di testo puรฒ contenere un numero illimitato di caratteri e il testo viene visualizzato con un carattere a larghezza fissa.
Vediamo ora un semplice esempio di come aggiungere la direttiva ng-model a un controllo area di testo. In questo esempio, mostreremo come passare una stringa multilinea dal controller alla vista e associare tale valore al controllo area di testo.
<!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 Spiegazione:
- Migliori direttiva sul modello ng allega la variabile membro chiamata โpDescriptioneโ al controllo โtextareaโ. Il โpDescriptLa variabile "ion" contiene il testo che viene passato al controllo dell'area di testo.
rows="4"andcols="50"Gli attributi si limitano a dimensionare il controllo in modo che il testo su piรน righe venga visualizzato correttamente. - La variabile membro โpDescriptallo ioneโ viene assegnato un valore multilinea.
\nLa sequenza di escape all'interno della stringa รจ ciรฒ che forza il testo su una seconda riga quando la textarea lo visualizza.
Produzione:
Dall'output, รจ chiaro che il testo multilinea assegnato nel controller viene visualizzato nel controllo dell'area di testo, diviso su due righe esattamente dove \n si siede.
2) Elementi di input
La direttiva ng-model funziona anche con i normali elementi di input. Di seguito, colleghiamo contemporaneamente una casella di testo e due caselle di controllo, in modo da poter vedere come ng-model gestisce un valore stringa e un valore booleano affiancati.
<!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 Spiegazione:
- La direttiva ng-model collega la variabile membro โpnameโ al controllo di input di testo e le proprietร
Topic.ControllerandTopic.Modelsai due controlli a casella di controllo. - Nel controller, a โpnameโ viene assegnata la stringa โGuru99โ, e allโoggetto โTopicโ vengono assegnati due membri booleani. Una casella di controllo associata a ng-model legge e scrive sempre un booleano, motivo per cui
truerende la casella selezionata efalselo lascia chiaro.
Produzione:
Dall'uscita,
- Si puรฒ vedere chiaramente che il valore assegnato al
pnamela variabile รจ โGuru99 ". - Poichรฉ il primo valore limite รจ
true, la casella di controllo รจ contrassegnata per la casella di controllo โControllerโ. Allo stesso modo, poichรฉ il secondo valore รจfalseLa casella di controllo "Modelli" non รจ selezionata.
3) Seleziona l'elemento dal menu a discesa
La direttiva ng-model puรฒ essere applicata anche all'elemento select, in modo che l'elemento scelto dall'utente venga memorizzato nel modello.
Qui avremo un campo di testo che contiene il nome "Guru99โ, e un elenco a discesa con due elementi, โControllerโ e โModelliโ.
โ ๏ธ Correzione: Lo screenshot qui sopra mostra l'elenco originale, che associava l'elemento select allo stesso Topics oggetto che ha fornito il testo dell'opzione. Nel momento in cui un utente sceglie un'opzione, AngularJS sovrascrive Topics con la stringa selezionata ed entrambe le opzioni scompaiono. L'elenco corretto qui sotto mantiene l'elenco in una proprietร e la selezione in un'altra e utilizza ng-options per creare la lista.
<!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 Spiegazione:
- L'input di testo รจ associato a
pNamee l'elemento select รจ associato aselectedTopicPoichรฉ l'elemento select ha una propria proprietร modello, la scelta di un'opzione non modifica mai l'elenco stesso. - Migliori
TopicsL'array contiene i due valori "Controller" e "Models".ng-optionsL'espressione attraversa l'array e visualizza un'opzione per ogni voce, quindi l'aggiunta di un terzo argomento non richiede alcuna modifica al markup. selectedTopicรจ preimpostato sulla prima voce, ed รจ questo che fa sรฌ che il menu a tendina si apra con un valore predefinito sensato invece che con una riga vuota.
Produzione:
Dall'output si puรฒ vedere che il valore assegnato al pName la variabile รจ โGuru99โ, e il controllo di selezione offre le opzioni โControllerโ e โModelliโ. A parte gli esempi funzionanti, a volte i binding si rifiutano di aggiornarsi, ed รจ utile conoscerne i motivi.
Perchรฉ a volte i binding ng-model falliscono
La maggior parte dei problemi segnalati relativi a ng-model non sono bug di AngularJS, ma conseguenze del funzionamento di scope e primitive.
Il caso classico รจ un binding inserito all'interno di una direttiva che crea uno scope figlio, come ng-ripetere, ng-if o ng-switch. Scrittura ng-model="name" lรฌ si crea una copia ombra nell'ambito figlio, quindi il genitore non vede mai la modifica. Collegamento a una proprietร di un oggetto invece โ ng-model="user.name" โ mantiene ogni ambito puntato allo stesso riferimento. Questo รจ il motivo per cui gli sviluppatori AngularJS esperti insistono sull'utilizzo del punto in ogni espressione ng-model.
Altre due cause spiegano la maggior parte del resto:
- Controller o modulo mancante: Se `ng-app` o `ng-controller` sono scritti in modo errato, il binding non visualizza nulla senza generare un errore.
- Valore modificato al di fuori di AngularJS: un valore impostato da un gestore jQuery o da una callback setTimeout arriva al di fuori del ciclo di digest, quindi la vista non si aggiorna finchรฉ
$scope.$apply()piste.
Controllando questi tre elementi si risolve la stragrande maggioranza dei problemi di connessione che sembrano non funzionare.







