A diretiva ng-model é um dos pilares do AngularJS, servindo como a ponte que conecta os dados da aplicação (model) aos elementos de interface do usuário (view), como input, select e textarea.
Implementação Básica
Ao utilizar o ng-model, você vincula o valor de um campo de entrada diretamente a uma propriedade no escopo do seu controlador.
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js"></script>
</head>
<body ng-app="appCadastro" ng-controller="usuarioCtrl">
<label>Nome do Usuário:</label>
<input ng-model="nomeUsuario">
<script>
var app = angular.module('appCadastro', []);
app.controller('usuarioCtrl', function($scope) {
$scope.nomeUsuario = "Carlos Silva";
});
</script>
</body>
</html>
O Conceito de Two-Way Data Binding
O "Two-Way Data Binding" (vinculação de dados bidirecional) garante que qualquer alteração feita no campo de entrada atualize instantaneamente a variável no controlador, e vice-versa. Podemos visualizar isso usando expressões de interpolação.
<div ng-app="appVisualizacao" ng-controller="viewCtrl">
<p>Digite seu cargo:</p>
<input ng-model="cargo">
<h2>Cargo definido: {{cargo}}</h2>
</div>
<script>
angular.module('appVisualizacao', []).controller('viewCtrl', function($scope) {
$scope.cargo = "Desenvolvedor";
});
</script>
Validação de Entradas
O ng-model também facilita a validação de formulários em tempo real. No exemplo abaixo, validamos se o conteúdo inserido corresponde a um formato de e-mail válido.
<form ng-app="" name="formularioValidacao">
<label>E-mail corporativo:</label>
<input type="email" name="campoEmail" ng-model="emailInput">
<span ng-show="formularioValidacao.campoEmail.$error.email" style="color:red">
O endereço de e-mail informado é inválido.
</span>
</form>
Estados da Aplicação
A diretiva fornece metadados sobre o estado dos controles, permitindo verificar se o usuário interagiu com o campo ou se os dados são válidos.
- $valid: Retorna veraddeiro se o conteúdo satisfizer as regras de validação.
- $dirty: Retorna verdadeiro se o valor original foi alterado pelo usuário.
- $touched: Retorna verdadeiro se o campo perdeu o foco (blur).
<form ng-app="" name="statusForm" ng-init="info='contato@empresa.com'">
<input type="email" name="inputStatus" ng-model="info" required>
<ul>
<li>Válido: {{statusForm.inputStatus.$valid}}</li>
<li>Modificado: {{statusForm.inputStatus.$dirty}}</li>
<li>Visitado: {{statusForm.inputStatus.$touched}}</li>
</ul>
</form>
Estilização Automática com Classes CSS
O AngularJS adiciona e remove classes CSS automaticamente nos elementos baesando-se no estado do ng-model. Isso permite estilizar campos inválidos de forma simples.
<style>
input.ng-invalid {
border: 2px solid orange;
background-color: #fff0f0;
}
input.ng-valid {
border: 2px solid green;
}
</style>
<form ng-app="" name="cssForm">
<p>Insira um valor obrigatório:</p>
<input name="campoObrigatorio" ng-model="texto" required>
</form>