Série AngularJS: Validando Formulário

angularjslogoA

Olá Pessoal,

Hoje vamos ver como customizar mensagens de validação em um formulário com AngularJS. Será uma simples validação. Para algo mais específico precisamos criar diretivas. Por exemplo, validar se o username é unico. Tem que criar uma diretiva que faça essa validação para poder exibir uma mensagem no formulário. Não vamos entrar nesse cenário aqui, pois já seria um novo post.

Lets go…

Github

O exemplo vai estar no projeto receipeangularexample no meu github

https://github.com/camilolopes/workspaceAngularJs
Development

Vou assumir que você já tem a configuração básica do AngularJS. Para o exemplo usarei rotas/deep linking para acessar o conteúdo.

Step 1 – Configurando a rota

when("/validationform", {
templateUrl : "formvalidation.html",
controller : recipeController}).

//restante do code omitido

 

Step 2 – Criando uma função no Controller

Vamos criar uma função bem simples no controller

var recipeController = function($scope, UserService) {
//codo omitted

$scope.send = function($scope){
alert("send");

}

};

 

Step 3 – Criando o formulário

Agora vem o nosso formulário. Veja:

<form name="mainForm" ng-submit="send()">
<div>
<label>Nome</label>
<input type="text" ng-model="user.name" name="username" required/>
<span ng-class="error" ng-show="mainForm.username.$error.required">Nome é obrigatório</span>
</div>
<div>
<label>email</label>
<input type="email" ng-model="user.email" name="useremail" required/>
<span ng-class="error" ng-show="mainForm.useremail.$error.required">Email é obrigatório</span>
<span ng-class="error" ng-show="mainForm.useremail.$error.email"> Formato do e-mail é inválido</span>
</div>
<div>
<label>Idade</label>
<input type="number" ng-model="user.age" name="userage" required ng-maxlength=2 ng-minlength=1>
<span ng-class="error" ng-show="mainForm.userage.$error.maxlength">Não é permitido mais que 2 digitos</span>
</div>
<div>
<label>Blog/Site</label>
<input type="url" ng-model="user.site" name="usersite" ng-maxlength=30>
<!-- the message only show when the form is validated-->
<div ng-show="mainForm.usersite.$dirty && mainForm.usersite.$invalid">
<span ng-class="error" ng-show="mainForm.usersite.$error.url">Url inválida</span>
</div>
</div>
<div>
<input type="submit" ng-disabled="mainForm.$invalid">
</div>
</form>

Entendendo o Código

Claro que precisamos entender o que o código faz. Focarei apenas no que é importante, ou seja, não preciso explicar o que um atributo required no campo input faz.

Primeiro ponto

Ter um nome para o formulário, sem um nome nada adianta entender o restante do código. É através dele que vamos acessar os campos.

<form name="mainForm" ng-submit="send()">

bloco nome

<div>
<label>Nome</label>
<input type="text" ng-model="user.name" name="username" required/>
<span ng-class="error" ng-show="mainForm.username.$error.required">Nome é obrigatório</span>
</div>

No campo input temos que dar um name para o nosso campo e estamos dizendo que ele é required e qual mensagem deve ser exiba. Se não fizermos isso será a mensagem default HTML 5. Na linha span estamos dizendo: “exiba esta mensagem se o campo username for inválido”, ou seja, se não tiver nada digitado vai exibir essa mensagem por padrão, como vimos na imagem anterior.
bloco email

<div>
<label>email</label>
<input type="email" ng-model="user.email" name="useremail" required/>
<span ng-class="error" ng-show="mainForm.useremail.$error.required">Email é obrigatório</span>
<span ng-class="error" ng-show="mainForm.useremail.$error.email"> Formato do e-mail é inválido</span>
</div>

 

Fizemos a mesma coisa do campo nome, a diferença é que aqui temos um campo do tipo email que valida o formato do e-mail, se este for inválido exibe a mensagem que colocamos na validação

<span ng-class="error" ng-show="mainForm.useremail.$error.email"> Formato do e-mail é inválido</span>

 

O objeto $error que estamos usando contém todas as validações para um específico formulário, que no nosso caso chama-se mainForm.

Lembrando que a estrutura é nomeDoForm.nomePropriedade.$error.attributo ou nomeDoForm.expression.

Para o bloco idade nada de diferente, então nem preciso explicar.

Bloco Site

Aqui estamos validando a url e para isso temos o type url ja no HTML 5.Mas, observe a diferença que a mensagem somente é exiba quando o campo é modificado, ela não aparece quando a página é carregada, como fizemos nos outros campos, isso devido a essa linha aqui:

<div ng-show="mainForm.usersite.$dirty && mainForm.usersite.$invalid">

 

Ela está dizendo: “se o campo usersite for modificado e inválido, exiba o conteudo desse bloco” que no nosso caso temos a mensagem “Url inválida.

$dirty retorna true se o campo foi modificado

Bloco botão submit

<div>
<input type="submit" ng-disabled="mainForm.$invalid">
</div>

 

E para garantir que o usuario nao vai submeter o form, vamos desabilitar o botão submit se o formulário é invalido, ou seja, se todos os requisitos não são atendidos esse botão fica disabled

Testando

angularformvalidationempty

 
angularformvalidationinvalid
Por hoje é isso, vou ficando por aqui e espero que tenham gostado do post.

abracos, see ya!!

Série AngularJS: Criando blackList com angular-ui validate

Olá Pessoal,

O objetivo do post de hoje é mostrar um pouquinho do que temos no angular-ui.  E para isso vou mostrar um recurso de ui-validate que permite validar se o valor recebido está em um Blacklist ou não.

Lets go…

Starting…

O angular-ui é uma suíte baseado no angularJS com vários componentes UI implementados. Tem coisas bem bacanas e é um projeto que é tão novo quanto o angularJS. Ainda acho o angular-ui um pouco bagunçado e tem poucas informações de como getstarted por exemplo para pegar o .js, não está em um local simples, tem bastante coisa separado. O ideal era oferecerem .js de maneira mais simples e fácil de achar no site.

O código é bem simples, apenas um input e o nome do usuário. Se ele digita alguma palavra que esteja no blacklist, o botão de submit não é habilitado.

Metendo a mão na massa

Vou considerar que você já vem acompanhando a série do angularJS e tem as configurações básicas. Não seria legal repetir toda configuração a cada novo post. Vou colocar apenas o código relacionado  ao objetivo do post.

Step 1

Adicione o angular-ui.js  ao projeto

Step 2

Como estou usando rotas e o ng-view tudo fica na index.html, então vou colocar para carregar o novo arquivo angular-ui.js  lá. Veja como fica:

<script src="js/lib/angular-ui.js"></script>

 Step 3

Crie um controller

var blacklistController= function($scope){

       //criando meu black list, um array.

       $scope.blacklist= ['satanas', 'biba'];

       //verifica se a palavra digitada corresponde ao que temos no blacklist

       $scope.notBlackListed = function(value){

             return $scope.blacklist.indexOf(value)===-1;

       }; 

};

 Step 4

Agora vamos criar o arquivo HTML, que não tem nada de especial. Chamei ele de angularui.html

<form name="form">

<label> first name</label>

<input name="firstname" type="text" ng-model="user.firstname" required

ui-validate="{blacklisted:'notBlackListed($value)'}"/>

 <button ng-disabled="form.$invalid" class="btn">Submit</button>

</form>

 

Step 5

Como estou usando o recurso de rotas do angularJS, preciso atualizar para quando eu chamar a url  /angularui ele deve carregar o controller. Basta adicionar a linha abaixo:

when("/angularui",{templateUrl:"angularui.html",controller:blacklistController}).

 

 Testando

Vamos testar agora:

uivalidateinvalid

Observe que o botão de submit não ficou ativo.

uivalidatevalid

Agora sim. Simples, não?

Claro que ao clicar nada acontece. O objetivo aqui não era dar funcionalidade real, mas mostrar como o ui-validate do angular-ui facilita nossa vida. Óbvio que as palavras do nosso blacklist deveriam ser recuperadas de uma base de dados através de um serviço  REST, por exemplo.

Bom, vou ficando por aqui. Espero que tenham curtido um pouco do angular-ui e é claro que há muito mais coisas, basta acessar  http://angular-ui.github.io  e se divertir.

Abraços. See ya!!

Série AngularJS: Usando Yeoman com AngularJS

yeoman

Olá Pessoal,

No post de hoje vamos ver como usar o Yeoman com AngularJS.  Eu falei sobre o Yeoman rapidamente nesse post.

Lets go…

Step 1

Para o ambiente Windows, você pode ter o Gitbash instalado com suporte a execução de comando linux/unix. Instale também o NodeJS.

Step 2

Agora abra o Gitbash e digite o comando

npm install -g yo

 

yoemaninstall

 

Ao terminar

yoemanfinishedinstall

 

Step 3

Para ter suporte à criação de projetos com o angular, precisamos instalar o generator para o framework.

npm install -g generator-angular

yoemaninstallangular

 Crie uma pasta algo como yeomandemo. Entre nela e digite

 yo

 

 Responda Y

 

E escolha a opção:

yo angular

 

E vá respondendo às perguntas.

yoemanangularsetup

Pronto, seu projeto foi criado. Para entender a estrutura há um post completo: http://www.sitepoint.com/kickstart-your-angularjs-development-with-yeoman-grunt-and-bower/

No meu github coloquei um exemplo do projeto demo que fiz com yoeman gerando o projeto com angular https://github.com/camilolopes/workspaceAngularJs

Abraços. See ya!!!

Série AngularJS Criando um dialog com AngularJS + AngularUI

 

Olá Pessoal,

Mais um post da série AngularJS e hoje vamos ver como criar um dialog. Eu lembro que uma vez tentei fazer isso em JavaScript puro e foi muito sofrimento, mas      o angular-ui nos facilita muita coisa.

Lets go..

 

Starting…

Como sempre, vou considerar que você já vem acompanhando a série e entende a estrutura básica com o angular e rotas. O projeto que tem os exemplos da série está no meu GitHub

Requisitos

  • – angular-ui-bootstrap-modal.js
  • – angular-ui.js

Para o dialog, é desse cara que precisamos. Você pode baixá-lo no projeto pegando o arquivo no meu github.

Na página do angular-ui tem exemplos bacanas usando o modal http://angular-ui.github.io/bootstrap/

Vamos agora colocar a mão na massa

Development

Step 1

Antes de começar, a estrutura aqui é baseada no meu projeto que está no github. Se você tem o seu basta fazer a adaptação onde atualizar. (O que?)

Primeiro passo é atualizarmos a declaração do module no arquivo app.js  deixando assim:

var app = angular.module(“myapp”, [ “ui”, “ui.directives”,”ui.bootstrap.modal” ]);

Adicionamos o “ui.bootstrap.modal”  (o “ui.directives” não é requerido para esse exemplo).

Step 2

Agora vamos atualizar o index.html informando para carregar .js  que tem a funcionalidade do dialog:

<head>

<script src=“js/lib/angular-ui-bootstrap-modal.js”></script>

<link rel=“stylesheet” href=“css/bootstrap.css”>

</head>

No meu caso esse é o caminho.  Adicionei o css do bootstrap para ficar com layout agradável.

Step  3

Vamos criar o controller que vai cuidar do dialog. No meu arquivo recipeController.js adicionei o seguinte controller:

var MyCtrlDialog = function($scope) {

$scope.open = function() {

$scope.showModal = true;

};

$scope.ok = function() {

$scope.showModal = false;

};

$scope.cancel = function() {

$scope.showModal = false;

};

};

A leitura é bem simples: quando a função open for chamada ele deve mostrar o modal, quando a função  ok ou cancel for chamada o modal deve ser fechado.

Step 4

Como estou usando rotas, vou adicionar uma para o dialog. Não é requerido que seja feito com rotas, desde que ao carregar o HTML os .js sejam carregados, tudo vai funcionar.

No arquivo app.js adicionei a rota:

when(“/dialog”, {

templateUrl : “dialog.html”,controller:MyCtrlDialog

}).

Step 5

Agora vamos criar o arquivo dialog.html para vermos o resultado:

<!– In this dialog is using angularui –>

<body>

<!– Criando um botão para abrir o modal –>

<button class=“btn” ng-click=“open()”>Open Dialog</button>

<!– My dialog Content –>

<div modal=“showModal” close=“cancel()”>

<div class=“modal-header”>

<h4>Modal Dialog</h4>

</div>

<div class=“modal-body”>

<p>Teste dialog. Are you sure?</p>

</div>

<div class=“modal-footer”>

<button class=“btn btn-success” ng-click=“ok()”>Ok</button>

<button class=“btn” ng-click=“cancel()”>Cancel</button>

</div>

</div>

</body>

 

Testando

 

angularjsdialog

 

angularjsdialogopened

 

Simples, não?

Abraços, see ya!!

 

AngularJS – Presentation

Olá Pessoal,

Quem me acompanha no twitter tem visto meus posts nas últimas semanas falando do AngularJS  e sabe que venho preparando uma série de posts que já estão prontos para sair do forno, e daqui a pouco estão por aqui com a primeira temporada de série. Neste primeiro post queria compartilhar com vocês uma apresentação que fiz a cerca de algumas semanas para um grupo de americanos sobre o framework. A ideia é discutir e saber como está o framework da Google.

Lets go… 

Starting…

A apresentação disponibilizei no meu slideshare. Como não gosto de apresentação detalhada, ou seja, no modelo de quase um livro, há apenas tópicos e imagens. Mas a depender do quanto você está envolvido com o framework, vai ter uma noção do que discutimos.

No geral, essa apresentação foi para mostrar como o AngularJS está dentro do mercado, já que é um framework novo, com apenas 2-3 anos de vida.  A discussão foi muito boa e o framework apresentou ser, para médio e longo prazo, uma adoção bem natural para desenvolvimento web.

Não quero adiantar esse assunto, pois é um dos posts da série que vou publicar aqui, mas aqui vai uma parte:

  • – Curva de aprendizado: essa aqui é excelente. Com apenas alguns minutos você entende o que o framework faz e como usá-lo. É muito simples;
  • – Suporte a MVC: isso é sensacional. Se você implementar usando MVC percebe o ganho que tem  ao ter isso do client-side. A manutenção é muito baixa. Mas, de novo, isso não depende do angularJS e sim quem está entre a cadeira e o computador.
  • – Boa documentação e comunidade ativa: isso é importante. Eu abri bugs, tirei dúvidas na thread de discussão do angularJS no github e realmente é uma comunidade bem ativa, e o team do AngularJS, quando respondem, são bem claros e específicos. Gostei muito do envolvimento com eles.
  • – Suporte IE: Para as versões mais recentes do IE não teremos problema em usar o angularJS, mas versões antigas como IE8 ou inferior, alguns recursos não funcionam. Se você procurar vai achar alguns “tricks” para fazer funcionar nessas versões bem antigas, mas a depender do que você está usando do angularJS, acaba não funcionando bem. Mas se você for na documentação do AngularJS vai ver que eles não garantem suporte nas versões mais antigas do IE.
  • – Rápido desenvolvimento: É realmente produtivo desenvolver com AngularJS. A facilidade e entendimento do código é algo sensacional, só programando para saber.

Atualmente estou trabalhando em um projeto e estamos usando o AngularJS(desde julho/2013) e a experiência  está sendo sensacional. Cada nova funcionalidade e integração que precisamos fazer é uma oportunidade de aprendizado. Quando comecei com o framework, senti falta de um grupo em português para discutir e ajudar outros desenvolvedores que estão querendo começar e resolvi criar o AngularJS-Brazil Group. Além de postar assuntos técnicos aqui no blog, estarei no grupo compartilhando links, “tricks” do dia a dia com os framework. Já comecei postando hotlinks para quem deseja começar e não sabe por onde. Em breve vou fazer um post sobre qual livro eu recomendo. Já li 2 livros sobre o assunto e estou indo para o terceiro e nem tudo que reluz é ouro. Vou fazer um post falando mais sobre os livros.

Bom, vou ficando por aqui, e Welcome to AngularJS world.  Vejo vocês na série AngularJS e lá no AngularJS-Brazil Group. 🙂

Abraços, see ya!!!!