AngularJS
Aplicações JS mais simples

Jean Lucas de Carvalho
Desenvolvedor Frontend com foco na experiência do usuário e entusiasta de tecnologias Frontend, criou a Futuring para ajudar jovens universitários a adentrarem no mercado de trabalho. É um dos Organizadores do GDG Goiânia e em 2013 participou do Google Developer Bus Brasil e criou o Frontend Goiás. Já palestrou em eventos como: Google DevFest Centro-Oeste, Seminário Locaweb, Android Bootcamp, FLISOL e Join Community. Trabalha com AngularJS desde 2013, contribuindo em projetos open-source e na estruturação e arquitetura de diversos projetos goianos que utilizam o framework.

Agenda
Durante o curso descobriremos por que utilizar o AngularJS, visitaremos os temas recorrentes durante o desenvolvimento de um WebApp e quais são as melhores práticas de desenvolvimento já buscando uma aproximação com o Angular 2.
1. Introdução
- Informações de mercado
- História
- Hello world
- Primeiro contato
- Por que?
- SPAs
- O que é o AngularJS?
2. Agenda de Contatos
- Configuração do Ambiente
- Definindo uma Aplicação
- Expressões
- Estrutura de um contato
- Trabalhando com dados
- Atualizando nossa interface
- Entendendo o $scope
- Exibindo e ocultando elementos da interface
- Listando múltiplos contatos
- O que aprendemos?
3. Agenda de Contatos, parte 2
- Filtros de dados
-
Trabalhando com imagens
-
Cadastrando novos contatos
-
Organizando as informações com abas
-
O que aprendemos?
4. Agenda de Contatos, parte 3
- Criando diretivas
-
Anatomia
-
Lógica
-
- Trabalhando com validações
- Organização de código via dependências
- O que aprendemos?
1. Introdução
Indeed Jobs

Google Trends

Vagas em Goiânia



História
- Criado em 2009 por Miško Hevery
- Projetado para auxiliar Web Designers sem experiência com desenvolvimento a interagir com o servidor
- 1 Aplicação (fonte)
- GWT - 3 devs, 6 meses
- AngularJS - 1 dev, 3 semanas
Hello World
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello World</title>
</head>
<body>
<div ng-app>
<label for="nome">Nome</label>
<input type="text"
name="nome"
id="nome"
ng-model="varNome"
placeholder="Insira seu nome aqui">
<hr>
<h1>Hello {{varNome}}</h1>
</div>
<script src="http://code.angularjs.org/1.3.15/angular.min.js"></script>
</body>
</html>Por que?
O AngularJS é uma boa escolha quando se está criando uma aplicação dinâmica que utilize javascript.
- Ajuda a organizar o JS
- Super produtivo
- Trabalha bem com jQuery
- É fácil de testar

But before,
Single Page Applications

But before,
Aplicações baseadas em APIs

Uma API, vários clientes

O que é o AngularJS?
Um framework javascript client-side para adicionar interatividade ao HTML
MV*

Componentes

One-Way Data Binding

Two-Way Data Binding

Three-Way Data Binding?

Estrutura da aplicação

Fluxo da aplicação

2. Agenda de contatos
Baixe as bibliotecas
- AngularJS 1.3.15
- Bootstrap
Módulos
<!DOCTYPE html>
<html ng-app="agenda">
<head>
<meta charset="utf-8">
<title>Agenda</title>
<link rel="stylesheet" type="text/css" href="bootstrap.min.css">
</head>
<body>
<script type="text/javascript" src="angular.min.js"></script>
<script type="text/javascript" src="app.js"></script>
</body>
</html>var app = = angular.module('agenda', [ ]);app.js
index.html
Expressões
<!DOCTYPE html>
<html ng-app="agenda">
<head>
<meta charset="utf-8">
<title>Agenda</title>
<link rel="stylesheet" type="text/css" href="bootstrap.min.css">
</head>
<body>
<div class="container">
{{3 + 4}}
</div>
<script type="text/javascript" src="angular.min.js"></script>
<script type="text/javascript" src="app.js"></script>
</body>
</html>index.html
?
Informações de contato
- Nome
- Telefone
- Aniversário
- Site
- Localização
- Redes Sociais (Facebook, Twitter, Linkedin, Github)
Trabalhando com dados
var contato = {
nome: 'Jean Lucas de Carvalho',
email: 'jlcarv@live.com',
telefone: '(62) 8162-1104',
localizacao: {
descricao: 'Casa, Rua Campo Grande',
latitude: 0,
longitude: 0
},
social: {
facebook: 'JeanLucasCarvalho',
twitter: 'JLCarv',
linkedin: null,
github: 'JLCarvalho'
}
};Controllers
(function(){
var app = angular.module('agenda', []);
app.controller('AgendaController', function($scope){
$scope.contato = {
nome: 'Jean Lucas de Carvalho',
email: 'jlcarv@live.com',
telefone: '(62) 8162-1104',
localizacao: {
descricao: 'Casa, Rua Campo Grande',
latitude: 0,
longitude: 0
},
social: {
facebook: 'JeanLucasCarvalho',
twitter: 'JLCarv',
linkedin: null,
github: 'JLCarvalho'
}
};
});
})()app.js
Binding
...
<div class="contatos">
<div class="contato">
<h1>Jean Lucas de Carvalho</h2>
<ul class="contato-info">
<li>
<span>Telefone</span>
<h2>(62) 8162-1104</h2>
</li>
<li>
<span>E-mail</span>
<h2>jeanlucasdecarvalho@gmail.com</h2>
</li>
...
</ul>
</div>
</div>
...index.html
Binding
...
<div class="contatos" ng-controller="AgendaController">
<div class="contato">
<h1>{{contato.nome}}</h2>
<ul class="contato-info">
<li>
<span>Telefone</span>
<h2>{{contato.telefone}}</h2>
</li>
<li>
<span>E-mail</span>
<h2>{{contato.email}}</h2>
</li>
...
</ul>
</div>
</div>
...index.html
Escopo
...
<div class="contatos" ng-controller="AgendaController">
<div class="contato">
...
</div>
</div>
{{contato.nome}}
...index.html
?
Exibir/Esconder
...
<div class="contatos" ng-controller="AgendaController">
<div class="contato">
<h1>{{contato.nome}}</h1>
<a href="" class="btn btn-info btn-block btn-lg"
ng-click="varEsconder = !varEsconder">
Exibir Informações
</a>
<ul class="contato-info" ng-show="varEsconder">
...
</ul>
</div>
</div>
...index.html
Múltiplos contatos
...
$scope.contatos = [
{
nome: 'Futuring Lab',
email: 'contato@futuring.com.br',
telefone: '(62) 3255-****'
},
{
nome: 'Jean Lucas de Carvalho',
email: 'jlcarv@live.com',
telefone: '(62) 8162-1104'
},
{
nome: 'Rafael Dias Soares',
email: 'rafael_gtt@hotmail.com',
telefone: '(62) 8503-8794'
}
];
...app.js
Múltiplos contatos
...
<div class="contatos" ng-controller="AgendaController">
<div class="contato" ng-repeat="contato in contatos">
<h1>{{contato.nome}}</h1>
<a href="" class="btn btn-info btn-block btn-lg"
ng-click="varEsconder = !varEsconder">
Exibir Informações
</a>
<ul class="contato-info" ng-show="varEsconder">
...
</ul>
</div>
</div>
...index.html
Output
O que aprendemos?
- Módulos
- Expressions
- Controllers
- Diretivas
- ng-app
- ng-controller
- ng-click
- ng-show
- ng-repeat
3. Agenda de contatos
Parte 2
Filtros
...
<h1>{{contato.nome | uppercase}}</h1>
...index.html
Exemplos
Receita de bolo
{{ dado | filtro:opções }}{{'1388123412323' | date:'MM/dd/yyyy @ h:mma'}} // 12/27/2013 @ 12:50AM{{'futuring' | uppercase}} // FUTURING{{'Jean Lucas de Carvalho' | limitTo:8}} // Jean Luc<li ng-repeat="product in store.products | limitTo:3"><li ng-repeat="contato in contatos | orderBy:'-nome'">Alterando nosso contato
...
$scope.contatos = [
{
nome: 'Futuring Lab',
email: 'contato@futuring.com.br',
telefone: '(62) 3255-****',
foto: 'https://avatars2.githubusercontent.com/u/1238663'
},
...
];
...app.js
Exibindo imagens
<div class="contato" ng-repeat="contato in contatos">
<h1>{{contato.nome}}</h1>
<img src="{{contato.foto}}" class="img-responsive"/>
...
</div>index.html
O navegador tentará exibir a imagem antes do angular obter o resultado da expressão.
<div class="contato" ng-repeat="contato in contatos">
<h1>{{contato.nome}}</h1>
<img ng-src="{{contato.foto}}" class="img-responsive"/>
...
</div>index.html
Com o ng-src o angular cuidará de exibir a imagem quando a expressão for evaluada.
Desafio
Como deixar nossa agenda dinâmica?
Agenda dinâmica
- Criar formulário
- Salvar conteúdo do formulário em nossa lista de contatos
- Exibir novo contato na interface
Criando nosso formulário
...
<form class="form" name="novoContato">
<div class="form-group">
<label for="inputNome">Password</label>
<input type="text" class="form-control" id="inputNome" placeholder="Nome">
</div>
<div class="form-group">
<label for="inputTelefone">Telefone</label>
<input type="text" class="form-control" id="inputTelefone" placeholder="Telefone">
</div>
<div class="form-group">
<label for="inputEmail">Email</label>
<input type="email" class="form-control" id="inputEmail" placeholder="Email">
</div>
<button type="submit" class="btn btn-default">Cadastrar</button>
</form>
...index.html
ng-model
Salvando os dados
...
<form class="form" name="novoContato" ng-submit="adicionarContato(contato)">
<div class="form-group">
<label for="inputNome">Password</label>
<input type="text" class="form-control" ng-model="contato.nome" id="inputNome" placeholder="Nome">
</div>
<div class="form-group">
<label for="inputTelefone">Telefone</label>
<input type="text" class="form-control" ng-model="contato.telefone" id="inputTelefone" placeholder="Telefone">
</div>
<div class="form-group">
<label for="inputEmail">Email</label>
<input type="email" class="form-control" ng-model="contato.email" id="inputEmail" placeholder="Email">
</div>
<button type="submit" class="btn btn-default">Cadastrar</button>
</form>
...index.html
Salvar?
Editar?
Excluir?
Organizando Informações
Criando abas

O que aprendemos?
- Filtros
- Formulários
- Two-way Data Binding
- ng-model
- Trabalhar com imagens
4. Agenda de contatos
Parte 3
Reutilizando abas

Manual das diretivas
Curso AngularJS, Aplicações JS mais simples
By Jean Lucas de Carvalho
Curso AngularJS, Aplicações JS mais simples
- 984
