Ionic Framework
1/16/2017

Como validar formulários com Ionic Framework

Nesse artigo você vai ver uma forma fácil de validar formulários com Ionic Framework e Angular JS.

Demo

validacao-ionic-framework-001

validacao-ionic-framework-002

validacao-ionic-framework-003

Regras para a validação

Nesse exemplo vamos usar as regras de validação abaixo para cada campo do formulário.

  • Campo "Nome": Obrigatório e no mínimo 2 caracteres.
  • Campo "E-mail: Obrigatório e um e-mail valido.
  • Campo "Telefone": Obrigatório e deve ter o formato "(99) 9999-9999" ou "(99) 99999-9999".
  • Campo "Altura": Obrigatório e deve ter o valor mínimo 1.
  • Campo "Nascimento": Obrigatório e deve ter uma data valida.

 

Validar formulários com o Angular JS

1 - Atributos e diretivas

  • Você consegue validar todos os tipos de input do HTML5:
    • text, number, url, email, date, radio, checkbox
  • Você consegue validar as seguintes diretivas:
    • required, pattern, minlength, maxlength, min, max
  • Caso seja necessário você pode criar diretivas customizadas para validações especificas que você precisar. Mais abaixo vou mostrar como criar uma diretiva customizada para validação.

 

2 - Propriedades do formulário

O Angular JS prove algumas propriedades que vão te auxiliar na validação do seu formulário.

NomeClasseTipoDescrição
$errorObjetoUm objeto com todas as diretivas de validação. Ex.: $error.required.
$pendingng-pendingObjetoUm objeto com as diretivas pendentes de validação. Ex.: $pending.required.
$untouchedng-untouchedBooleanTrue se o controle ainda não perdeu o foco.
$touchedng-touchedBooleanTrue se o controle já perdeu o foco.
$pristineng-pristineBooleanTrue se o usuário ainda não interagiu com o controle.
$dirtyng-dirtyBooleanTrue se o usuário já interagiu com o controle.
$validng-valid/ng-valid-[key]BooleanTrue se não tem nenhum erro.
$invalidng-invalid/ng-invalid-[key]BooleanTrue se tem algum erro.

3 - Acessando as propriedades

Acessar o formulário: [form name].[angular property] Ex.: myForm.$error Accesar um input: [form name].[input name].[angular property] Ex.: myForm.myInput.$error  

4 - Exibindo as mensagens

As propriedades $valid e $invalid já são suficientes para exibir uma mensagem de validação. Para exibir uma mensagem especifica para cada diretiva de validação usamos o objeto $error. E para exibir a mensagem apenas após o usuário interagir com o controle utilizamos a propriedades $pristine. No exemplo abaixo eu exibo uma mensagem de validação para o campo obrigatório e outra para a quantidade mínima de caracteres.

 

5 - Adicionado classes condicionais com o ng-class

O ng-class permite que você adicione classes adicionas baseado em uma expressão. No exemplo abaixo eu adiciono a classe input-error na label quando o controle está invalido.

 

6 - Desabilitando o botão de submeter com o ng-disabled.

Para desabilitar o botão de submeter o formulário vamos combinar o ng-disabled com a proprieade $invalid do form.

 

Colocando em pratica todas as informações acima

Caso não saiba criar um aplicativo com o Ionic Framework, você pode ver um tutorial clicando aqui ou assistir a um vídeo clicando aqui.  

1 - Criando o formulário

Index.html

<label class="item item-input item-stacked-label" ng-class="{ 'input-error' : (contato.email.$error.required || contato.email.$error.email) && !contato.email.$pristine }">
    <span class="input-label">E-mail</span>
    <input type="email" name="email" ng-model="model.email" required>
    <span class="error" ng-show="contato.email.$error.required && !contato.email.$pristine">E-mail é obrigatório</span>
    <span class="error" ng-show="contato.email.$error.email && !contato.email.$pristine">E-mail inválido</span>
</label>

<label class="item item-input item-stacked-label" ng-class="{ 'input-error' : (contato.tel.$error.required || contato.tel.$error.telefone) && !contato.tel.$pristine }">
    <span class="input-label">Telefone</span>
    <input type="tel" name="tel" ng-model="model.tel" required telefone />
    <span class="error" ng-show="contato.tel.$error.required && !contato.tel.$pristine">Telefone é obrigatório</span>                
    <span class="error" ng-show="contato.tel.$error.telefone && !contato.tel.$pristine">Telefone inválido</span>                
</label>

<label class="item item-input item-stacked-label" ng-class="{ 'input-error' : (contato.altura.$error.required || contato.altura.$error.min) && !contato.altura.$pristine }">
    <span class="input-label">Altura</span>
    <input type="number" name="altura" ng-model="model.altura" required min="1">
    <span class="error" ng-show="contato.altura.$error.required && !contato.altura.$pristine">Altura é obrigatório</span>
    <span class="error" ng-show="contato.altura.$error.min && !contato.altura.$pristine">No mínimo 1</span>
</label>

<label class="item item-input item-stacked-label" ng-class="{ 'input-error': (contato.dtnascimento.$error.required || contato.dtnascimento.$error.date) && !contato.dtnascimento.$pristine }">
    <span class="input-label">Nascimento</span>
    <input type="date" name="dtnascimento" ng-model="model.dtNascimento" required>
    <span class="error" ng-show="contato.dtnascimento.$error.required && !contato.dtnascimento.$pristine">Nascimento é obrigatório</span>
    <span class="error" ng-show="contato.dtnascimento.$error.date && !contato.dtnascimento.$pristine">Data inválida</span>
</label>

<button class="button button-positive button-block" type="submit" ng-disabled="contato.$invalid">Salvar</button>
  • Incluir na tag do form o atributo novalidate. É uma boa pratica utilizar esse atributo, pois ele previne as validações padrão do navegador e não exibe nenhuma mensagem intrusiva para o usuário.
  • É importante utilizar o atributo ng-model em cada input para ter um bind do controle na tela para uma variável no controller do Angular JS.
  • Note também que foi incluído em cada input as regras mencionadas no inicio desse artigo.

 

2 - Criando o controller

validacao.ctrl.js

angular.module('app').controller('ValidacaoCtrl', function ($scope) { $scope.model = { nome: null, email: null, tel: null, altura: null, dtNascimento: null };

$scope.onSubmit = function () {
    alert('Teste')
};

});

  • $scope.model é o objeto que contem as propriedades do model. Cada propriedade desse objeto será utilizada na tag ng-model de cada input.
  • $scope.onSubmit é a função que será executada ao submeter o formulário. No arquivo index.html você pode ver que é incluída o atributo ng-submit na tag form. Ex: ng-submit="onSubmit()".

 

3 - Criando validações customizadas

telefone.directive.js

angular.module('app').directive('telefone', function () { return { require: 'ngModel', link: function (scope, elm, attrs, ctrl) { ctrl.$validators.telefone = function (modelValue, viewValue) { var TELEFONE_REGEXP = /^(\([0-9]{2}\))\s([9]{1})?([0-9]{4})-([0-9]{4})$/;

            if (ctrl.$isEmpty(modelValue)) {
                // considerar o campo vazio como valido
                return true;
            }

            if (TELEFONE\_REGEXP.test(viewValue)) {
                // se passar no teste está valido
                return true;
            }

            // Não é valido
            return false;
        };
    }
};

});

  • A diretiva telefone foi criada para validar os seguintes formatos de telefone: "(99) 9999-9999" ou "(99) 99999-9999".
  • Para usar a diretiva, basta colocar o atributo telefone no input.

Quer aprender a criar apps com Ionic?

Se você ainda tem algumas dificuldades ou quer aprender um pouco mais, clique no botão abaixo e participe de um minicurso sobre Ionic 100% online e 100% gratuito!  

[button style="btn-danger btn-lg" type="link" target="true" title="ME INSCREVER AGORA" link="https://www.fabricadecodigo.com/minicursoionic/" linkrel=""]

Conclusão

É muito fácil fazer validações com o Angular JS no Ionic Framework. Um dos maiores benefícios de utilizar validações assim é que elas são feitas em real time, ou seja, as mensagens são exibidas de acordo com que o usuário interage com o controle.  

Referências:

Eu espero que esse tutorial tenha sido útil para você. Qualquer dúvida deixe seu comentário abaixo. O código fonte de exemplo está disponível no GitHub.