+
Formação Front-End (Angular JS + Boostrap)
Julian Cesar dos Santos
Versão 1.1
Agenda
Aula 1 – Introdução ao JavasScript (JS)
Aula 2 – Introdução ao AngularJS
Aula 3 – AngularJS // Directives
Aula 4 – AngularJS // Controllers
Aula 5 – AngularJS // Services
Aula 6 – AngularJS // Views
Aula 7 – Requisições AJAX
Aula 8 – Armazenamento Local
Aula 9 – Bootstrap e Responsividade
Aula 10 – Projeto Final
Curso Front-End (AngularJS + Bootstrap) 2
O que o Curso NÃO abordará
Ferramentas
IDE
Bower
Grunt
Node (NPM)
Outras Bibliotecas Auxiliares
Curso Front-End (AngularJS + Bootstrap) 3
IDE?!
Eclipse
https://jsfiddle.net/
Curso Front-End (AngularJS + Bootstrap) 4
Aula 01
Introdução ao JavaScript
+
Curso Front-End (AngularJS + Bootstrap)
JavaScript
O que é?
JavaScript é uma linguagem de programação interpretada.
Foi originalmente implementada como parte dos
navegadores web para que scripts pudessem ser
executados do lado do cliente e interagissem com o
usuário sem a necessidade deste script passar pelo
servidor, controlando o navegador, realizando
comunicação assíncrona e alterando o conteúdo do
documento exibido.
Curso Front-End (AngularJS + Bootstrap) 6
JavaScript
Para que foi criado?
O uso primário de JavaScript é escrever funções que são
embarcadas ou incluídas em páginas HTML e que
interagem com o Modelo de Objeto de Documentos
(DOM) da página. Alguns exemplos deste uso são:
abrir uma nova janela com controle programático sobre seu
tamanho, posição e atributos;
validar valores de um formulário para garantir que são aceitáveis
antes de serem enviados ao servidor;
mudar imagens à medida que o mouse se movimenta sob elas.
Curso Front-End (AngularJS + Bootstrap) 7
JavaScript
DOM!?
O Modelo de Objeto de Documento (do inglês Document
Object Model - DOM) é uma convenção multiplataforma
e independente de linguagem para representação e
interação com objetos em documentos HTML, XHTML e
XML.
Para apresentar um documento como uma página HTML,
a maioria dos navegadores utilizam um modelo
internacional similar ao DOM. Os nós de cada documento
são organizados em uma estrutura de árvore, chamada de
árvore DOM, com o nó superior denominado "Document
object" (objeto Documento).
Curso Front-End (AngularJS + Bootstrap) 8
JavaScript
Funções
Crie uma pasta JavaScript no seu Desktop e dentro um
arquivo chamado index.html
Adicione o seguinte conteúdo dentro:
Tag que informa ao navagador
<script type="text/javascript"> que dentro é um código JS
function square(number) {
return number * number; Declaração da função e
} o seu parâmetro de entrada
console.log(square(2)); Retorno da função
</script>
Chamada da função e
envia da saída para o console
Abra o arquivo index.html com o Chrome
Curso Front-End (AngularJS + Bootstrap) 9
JavaScript
Ferramenta de Desenvolvedores
Em todos os navegadores mais modernos existe uma
ferramenta nativa que oferece algumas funcionalidades
que permitem ajudar no desenvolvimento
Para acessar a ferramenta de desenvolvimento do
Chromium aperte a tecla F12
No caso do exemplo anterior da raíz quadrada a aba
Console ficará da seguinte maneira
Saída da linha:
console.log(square(2));
Curso Front-End (AngularJS + Bootstrap) 10
JavaScript
Funções
Outra maneira de escrever a mesma coisa:
<script type="text/javascript">
var square = function (number) {
return number * number;
}
console.log(square(2));
</script>
Curso Front-End (AngularJS + Bootstrap) 11
JavaScript
Funções Aninhadas
<script type="text/javascript">
function operations(number1) {
function sum(number2) {
return number1 + number2;
}
return sum;
}
var func_sum = operations(3);
var result1 = func_sum(5);
console.log(result1);
var result2 = operations(3)(5);
console.log(result2);
</script>
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions
Curso Front-End (AngularJS + Bootstrap) 12
JavaScript
Debug
Com a Ferramenta do Desenvolvedor aberta (F12) acesse
a aba Source
Arquivo que
Iremos manipular
Código do Arquivo
Curso Front-End (AngularJS + Bootstrap) 13
JavaScript
Debug
Para iniciar a depuração selecione uma linha clicando no
número da linha, selecionaremos a linha 6 e atualize a
página (F5) para rodar novamente o script
Controles de
depuração
Breakpoint
Situação das
variáveis
Curso Front-End (AngularJS + Bootstrap) 14
JavaScript
Objetos JSON Função que altera
function myFunc(theObject) { o fabricante do objeto
theObject.make = "Toyota";
} Objeto do meu carro
var mycar = { make: "Honda", model: "Accord", year: 1998 };
console.log(mycar.make); Mostra o fabricante
do meu carro
myFunc(mycar); Chama a função de
alteração de fabricante
console.log(mycar.make);
Mostra novamente o
fabricante do meu carro
Especificação JSON: http://json.org/
Curso Front-End (AngularJS + Bootstrap) 15
JavaScript
Hierarquia do objeto JavaScript
function Exemplo() {
this.propriedade = 'Isso é uma propriedade.',
this.metodo = function() {
return 'Isso é um metódo';
var objeto = new Exemplo(); NEW!?
console.log(objeto.propriedade),
console.log(objeto.metodo());
Curso Front-End (AngularJS + Bootstrap) 16
JavaScript
Try...Catch
try {
throw "myException";
} catch (e) {
console.log(e);
} finally {
console.log("Always execute");
Curso Front-End (AngularJS + Bootstrap) 17
Aula 02
Introdução ao AngularJS
+
Curso Front-End (AngularJS + Bootstrap)
AngularJS // Introdução
O que é?
O AngularJS é um framework baseado em MVC (Models
Views Controls). O propósito do AngularJS é tirar a View e
até o Controller do servidor, sendo assim você trabalha
somente com arquivos .html estáticos, e quando precisar
de dados é realizado uma requisição via AJAX, assim todo
o processo é processado via Client, dando a possibilidade
de você criar HTML dinâmico, com isso você ganha muita
velocidade em sua aplicação, sem depender do servidor
para criar seu HTML.
AngularJS é o que o HTML teria sido se tivesse
sido projetado para desenvolvedor aplicações.
Curso Front-End (AngularJS + Bootstrap) 19
AngularJS // Introdução
AngularJS vs JQuery
Angular.js é um framework. Na execução do Angular.js,
ocorre o carregamento, onde sua árvore DOM e
JavaScript é tranformada em um aplicativo angular. Isso
ocorre pois o código HTML com caracteres especiais
(diretivas e filtros angular) é compilado e o Angular realiza
uma vinculação entre Controller, Model e View
Já JQuery é uma biblioteca javascript para manipulação do
DOM (ex. mudança de cores de um elemento, eventos
onclick, animação, etc...). Na execução do JQuery, seu
código irá realizar chamadas a funções de uma biblioteca,
solicitado por algum evento DOM por exemplo
Curso Front-End (AngularJS + Bootstrap) 20
AngularJS // Introdução
Conceitos
Template – HTML com marcação adicional
Directives – estender HTML com atributos personalizados
e elementos
Model – dados mostrados para o usuário na view com o
qual interage usuário
Scope – contexto em que o model é armazenado para que
os controllers, directives and expressions podem acessá-lo
Expressions – variáveis de acesso e funções de aplicação.
Filter – formata valores para serem mostrados para os
usuários
Curso Front-End (AngularJS + Bootstrap) 21
AngularJS // Introdução
Conceitos (Cont.)
View – que o usuário vê (o DOM)
Data Binding – sincroniza os dados entre os Models e as
Views
Controller – lógica de negocio por trás da visualizaçao.
Module – um recipiente para as diferentes partes de um
aplicativo, incluindo controllers, services, filters, directives
que configura o Injector.
Service – conjunto de lógica de negócio reutilizável
independentes de views.
Curso Front-End (AngularJS + Bootstrap) 22
AngularJS // Introdução
Vantagens
Manutenível
Flexível
Testável
Desacoplado
Curso Front-End (AngularJS + Bootstrap) 23
AngularJS // Introdução
Principais Diretivas
ng-app: esta diretiva define uma aplicação AngularJS no
conteúdo HTML
ng-model: esta diretiva faz a ligação (bind) dos valores
entre a aplicação AngularJS e os campos do HTML
ng-bind: esta diretiva faz a ligação (bind) entre os dados da
aplicação AngularJS e as marcações do HTML
Curso Front-End (AngularJS + Bootstrap) 24
AngularJS // Introdução
Primeiro App com AngularJS
Vamos para o nosso primeiro código!
Crie uma pasta AngularJS no seu Desktop e dentro um
arquivo chamado index.html
Adicione o seguinte conteúdo dentro:
<html ng-app>
Inicializa o AngularJS e
<head>
informa o contexto do seu App
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
</head>
<body>
<h1>Meu Primeiro App AngularJS </h1> Carrega o arquivo principal
</body> do framework
</html>
Abra o arquivo index.html com o Chrome
Curso Front-End (AngularJS + Bootstrap) 25
AngularJS // Introdução
Primeiro App com AngularJS
Adicione o seguinte conteúdo abaixo da tag H1:
Diretiva ng-model que faz a ligação
... entre a view e o model/variável
<div>
<label>Nome: </label>
<input type="text" ng-model="nome" placeholder="Digite seu nome" />
<h1> Olá, {{nome}}! </h1>
</div>
...
Mostra a variável
Curso Front-End (AngularJS + Bootstrap) 26
AngularJS // Introdução
Primeiro App com AngularJS
ng-model: é utilizado em elementos de formulário, como
input, select e textarea. Ele faz uma interligação entre sua
View e o Model do AngularJS. Com ele é possível também
fazer o controle de validações do formulário,
possibilitando a captura do dado informado ao envio do
formulário.
{{variável}}: são as variáveis ou expressões do AngularJS,
quando ele é compilado ele substitui essa variável pelo
Model, tanto dentro de um input, como dentro de
Controllers e entre outros, ele reconhece as quatros
chaves, como uma chamada para alterar essa variável pelo
um valor.
No exemplo anterior a nossa variável é {{nome}}, pois foi
definido ao Model esta variável, como ng-model=”nome”.
Curso Front-End (AngularJS + Bootstrap) 27
AngularJS // Introdução
Primeiro App com AngularJS
Encoding
...
<head>
<meta charset="UTF-8">
...
</head>
...
Teste de Expressão
...
</div>
<p>1 + 2 = {{ 1 + 2 }}</p>
</body>
...
Curso Front-End (AngularJS + Bootstrap) 28
AngularJS // Introdução
Primeiro App com AngularJS
Resultado
Curso Front-End (AngularJS + Bootstrap) 29
AngularJS // Introdução
Outro App com AngularJS
<html ng-app="myapp">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
</head>
<body>
<div ng-controller = "HelloController"
<h2>Welcome {{helloTo.title}} to the world!</h2>
</div>
Nosso primeiro Nosso primeiro
<script> módulo! controller!
angular.module("myapp", [])
.controller("HelloController", function($scope) {
$scope.helloTo = {};
$scope.helloTo.title = "AngularJS";
});
</script>
</body>
</html>
Curso Front-End (AngularJS + Bootstrap) 30
Aula 03
AngularJS // Directives
+
Curso Front-End (AngularJS + Bootstrap)
AngularJS // Directives
Diretivas
São usadas para extender as marcações do HTML
https://code.angularjs.org/1.4.9/docs/api/ng/directive
Curso Front-End (AngularJS + Bootstrap) 32
AngularJS // Directives
Diretiva ng-repeat
Esta diretiva repete elementos HTML para cada item
dentro de uma coleção
<div ng-app
ng-init="countries=[{locale:'en-US',name:'United States'}, {locale:'en-GB',name:'United Kingdom'},
{locale:'en-FR',name:'France'}]">
<h1>List of Countries with locale:</h1>
<ol>
<li ng-repeat="country in countries">
{{ 'Country: ' + country.name + ', Locale: ' + country.locale }}
</li>
</ol>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
Curso Front-End (AngularJS + Bootstrap) 33
AngularJS // Directives
Criando uma diretiva
Elas são muito úteis em várias situações, mas quando se
percebe que será necessario manipular o DOM dentro de
um controller muito provavelmente o correto é escrever
uma diretiva para essa função
Uma diretiva pode assumir algumas formas:
Como atributo: <a custom-button>Click me</a>
Como elemento: <custom-button>Click me</custom-button>
Como classe CSS: <a class="custom-button">Click me</a>
Como comentário: <!-- directive: custom-button -->
Curso Front-End (AngularJS + Bootstrap) 34
AngularJS // Directives
Criando a minha própria diretiva
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="docsSimpleDirective" ng-controller="Controller">
<div my-customer></div>
</div>
<script>
angular.module('docsSimpleDirective', [])
.controller('Controller', ['$scope', function($scope) {
$scope.customer = {
name: 'Naomi',
address: '1600 Amphitheatre'
};
}])
.directive('myCustomer', function() {
return {
template: 'Name: {{customer.name}} Address: {{customer.address}}'
};
});
</script>
http://www.sitepoint.com/practical-guide-angularjs-directives/
Curso Front-End (AngularJS + Bootstrap) 35
AngularJS // Directives
Detalhe Importante na Definição dos Nomes
Prefixo data- e x-: estes prefixos em qualquer diretiva é
ignorado, pois normalmente ele é usado para que o HTML
passe por algum validador
Normalização: converte os delimitadores :, -, ou _ no nome
em camelCase
Portanto: ng-bind, ng:bind, ng_bind, data-ng-bind e x-ng-
bind são a mesma coisa.
Boa pratica: prefira usar a opção de separação por hifen
(ng-bind para ngBind). E se quiser usar alguma ferramenta
de validação de HTML, use data- como prefixo (data-ng-
bind para ngBind).
Curso Front-End (AngularJS + Bootstrap) 36
AngularJS // Directives
Detalhe Importante na Definição dos Nomes
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="docsBindExample" ng-controller="Controller">
Hello <input ng-model='name'> <hr/>
<span ng-bind="name"></span> <br/>
<span ng:bind="name"></span> <br/>
<span ng_bind="name"></span> <br/>
<span data-ng-bind="name"></span> <br/>
<span x-ng-bind="name"></span> <br/>
</div>
<script>
angular.module('docsBindExample', [])
.controller('Controller', ['$scope', function($scope) {
$scope.name = 'Teste de nomenclatura de diretivas';
}]);
</script>
Curso Front-End (AngularJS + Bootstrap) 37
Aula 04
AngularJS // Controllers
+
Curso Front-End (AngularJS + Bootstrap)
AngularJS // Controllers
Para que servem
Inicializar um escopo (variável $scope)
Adicionar comportamentos ao escopo (variável $scope)
Para que NÃO serve
Manipular a árvore DOM
Formatar campos
Filtrar saídas
Compartilhar código ou estados entre controllers
Gerenciar o ciclo de vida de outros componentes
Curso Front-End (AngularJS + Bootstrap) 39
AngularJS // Controllers
Inicializando um Controller e seu Escopo
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="myApp" ng-controller="GreetingController">
{{ greeting }}
</div>
<script>
var myApp = angular.module('myApp',[]);
myApp.controller('GreetingController', ['$scope', function($scope) {
$scope.greeting = 'Hola!';
}]);
</script>
Foi usado uma anotação injeção de dependencia
para informar explicitamente a dependência
do Controller com relação ao serviço $scope
Curso Front-End (AngularJS + Bootstrap) 40
AngularJS // Controllers
Adicionando um Comportamento no Controller
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="myApp" ng-controller="DoubleController">
Two times <input ng-model="num"> equals {{ double(num) }}
</div>
<script>
var myApp = angular.module('myApp',[]);
myApp.controller('DoubleController', ['$scope', function($scope) {
$scope.double = function(value) {
return value * 2;
};
}]);
</script>
Curso Front-End (AngularJS + Bootstrap) 41
AngularJS // Controllers
O uso correto do Controller
De maneira geral o Controller não deve fazer muita coisa,
ele deve conter somente a lógica de negócio necessaria
para uma View
O caminho mais comum para manter o Controller limpo é
encapsular todo o trabalho que não for de negócio dentro
de Services e então usar estes por meio das dependências
do Controller
...
app.controller('Controller',['$scope','service', function($scope,service) {
...
}]);
...
Curso Front-End (AngularJS + Bootstrap) 42
AngularJS // Controllers
Convenção do Prefixo ‘$’
É possível criar Services (Serviços), e foi criada uma
convenção com relação a serviços, escopos e outras
funcionalidades que já façam parte do próprio AngularJS,
sendo que para isso estes componentes tem como prefixo
o $, como o $scope
Não use $ como prefixo para evitar possiveis colisões de
nomes
Curso Front-End (AngularJS + Bootstrap) 43
AngularJS // Controllers
Exemplo usando Pimentas!
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="spicyApp1" ng-controller="SpicyController">
<button ng-click="chiliSpicy()">Chili</button>
<button ng-click="jalapenoSpicy()">Jalapeno</button>
<p>The food is {{spice}} spicy!</p>
</div>
<script>
var myApp = angular.module('spicyApp1', []);
myApp.controller('SpicyController', ['$scope', function($scope) {
$scope.spice = 'very';
$scope.chiliSpicy = function() {
$scope.spice = 'chili';
};
$scope.jalapenoSpicy = function() {
$scope.spice = 'jalapeno';
};
}]);
</script>
Curso Front-End (AngularJS + Bootstrap) 44
AngularJS // Controllers
Funcionamento da Herança de Escopos
<scriptsrc="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="scopeInheritance" class="spicy">
<div ng-controller="MainController">
Hi {{name}}!
<div ng-controller="ChildController">
Hi {{name}}!
<div ng-controller="GrandChildController">Hi {{name}}!</div>
</div>
</div>
</div>
<style> div.spicy div { border: solid 2px blue; } </style>
<script>
var myApp = angular.module('scopeInheritance', []);
myApp.controller('MainController', ['$scope', function($scope) {
$scope.name = 'Nikki';
}]);
myApp.controller('ChildController', ['$scope', function($scope) {
$scope.name = 'Mattie';
}]);
myApp.controller('GrandChildController', ['$scope', function($scope) {
$scope.name = 'Gingerbread Baby';
}]);
</script>
Curso Front-End (AngularJS + Bootstrap) 45
AngularJS // Controllers
Funcionamento da Herança de Escopos (Cont.)
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="scopeInheritance" class="spicy">
<div ng-controller="MainController">
Hi {{name}}!
<div ng-controller="ChildController">
Hi {{name}}!
<div ng-controller="GrandChildController">Hi {{name}}!</div>
</div>
</div>
</div>
<style> div.spicy div { border: solid 2px blue; } </style>
<script>
var myApp = angular.module('scopeInheritance', []);
myApp.controller('MainController', ['$scope', function($scope) {
$scope.name = 'Nikki';
}]);
myApp.controller('ChildController', ['$scope', function($scope) {
// Atribuição ao model excluída
}]);
myApp.controller('GrandChildController', ['$scope', function($scope) {
$scope.name = 'Gingerbread Baby';
}]);
</script>
Curso Front-End (AngularJS + Bootstrap) 46
AngularJS // Controllers
Exemplo de Utilização de Controller
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="mainApp" ng-controller="studentController">
Enter first name:
<input type="text" ng-model="student.firstName">
<br /> Enter last name:
<input type="text" ng-model="student.lastName">
<br /> You are entering: {{student.fullName()}}
</div>
<script>
var mainApp = angular.module("mainApp", []);
mainApp.controller('studentController', function($scope) {
$scope.student = {
firstName: "Mahesh",
lastName: "Parashar",
fullName: function() {
var studentObject = $scope.student;
return studentObject.firstName + " " + studentObject.lastName;
}
};
});
</script>
Curso Front-End (AngularJS + Bootstrap) 47
Aula 05
AngularJS // Services
+
Curso Front-End (AngularJS + Bootstrap)
AngularJS // Services
O que é
Os Services são funções javascript e são responsáveis para
fazer apenas a tarefas específicas. Isso os torna uma entidade
individual que é de fácil manutenção e testável
Os serviços são normalmente injetado usando o mecanismo
de injeção de dependência do AngularJS
Por padrão o AngularJS fornece diversos serviços embutidos
como $http, $route, $window, $location, etc
Curso Front-End (AngularJS + Bootstrap) 49
AngularJS // Services
O que é
Cada serviço é responsável por uma tarefa específica, por
exemplo, $http é usado para fazer chamadas ajax para obter
os dados do servidor.
O $route é utilizado para definir a informação de
redirecionamentos dentro do app, e assim por diante
Serviços embutidos sempre tem o prefixo $
Curso Front-End (AngularJS + Bootstrap) 50
AngularJS // Services
Factory, Service e Provider
Existem 3 maneiras de criar um serviço:
Factory: pode retornar qualquer tipo de dado, não existe uma maneira
ou padrão explicito que você deva seguir para criar esses dados, você
precisa somente retornar algo
Service: trabalha muito parecido com o Factory, a direfença é que o
Service nos da como retorno uma uma instancia dele mesmo ao invés
de retornar um novo objeto como em Factory, em outras palavras é
como se estivese-mos utilizando um new ServiceName()
Provider: são muito parecidos com Services e Factories, mas são
completamente configurável, o que pode tornar eles um pouco mais
complexos. Você só precisa retornar seu serviço em uma função
chamada $get que nos dá a API publica daquele serviço, em outras
palavras o que vier dentro do nosso retorno em $get funciona
exatamente como um factory por exemplo.
Curso Front-End (AngularJS + Bootstrap) 51
AngularJS // Services
Factory, Service e Provider
Factory:
app.factory('todoListService', function() { Cria as funções que
var todoList = []; serão retornadas
function addTodo(todo) {
// Sua implementação
}
function removeTodo(todo) {
// Sua implementação
}
return {
Retorna o objeto que
todoList: todoList,
addTodo: addTodo, contém as funções para
removeTodo: removeTodo serem usadas posteriormente
};
});
Curso Front-End (AngularJS + Bootstrap) 52
AngularJS // Services
Factory, Service e Provider
Service:
app.service('todoListService', function() {
this.todoList = [];
this.addTodo = function (todo) { Cria as funções que
// Sua implementação serão utilizadas
}
this.removeTodo = function (todo) {
// Sua implementação
}
});
Curso Front-End (AngularJS + Bootstrap) 53
AngularJS // Services
Factory, Service e Provider
Provider:
app.provider('todoListService', function() {
var todoList = [];
return {
loadDefaults: function(newList) { Função de inicialização
todoList = newList;
},
$get: function() {
function addTodo(todo) { Cria as funções que
// Sua implementação
serão utilizadas
}
function removeTodo(todo) {
// Sua implementação
}
return {
todoList: todoList,
Retorna o objeto que
addTodo: addTodo, contém as funções para
removeTodo: removeTodo serem usadas posteriormente
};
}
};
});
Curso Front-End (AngularJS + Bootstrap) 54
AngularJS // Services
Factory, Service e Provider
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="mainApp" ng-controller="CalcController">
<p>Enter a number: <input type="number" ng-model="number" /> </p>
<button ng-click="square()">X<sup>2</sup></button>
<p>Result: {{result}}</p>
</div>
<script>
var mainApp = angular.module("mainApp", []);
mainApp.factory('MathService', function() {
var factory = {};
factory.multiply = function(a, b) { return a * b }
return factory;
});
mainApp.service('CalcService', function(MathService) {
this.square = function(a) { return MathService.multiply(a, a); }
});
mainApp.controller('CalcController', function($scope, CalcService) {
$scope.square = function() { $scope.result = CalcService.square($scope.number); }
});
</script>
Curso Front-End (AngularJS + Bootstrap) 55
AngularJS // Services
Values e Constants
Exemplo de Utilização:
var app = angular.module("mainApp", []);
app.value('appInfoValue', {version: "2.0"} );
app.constant('appInfoConstant', {version: "2.0"} );
app.controller('MyController', ['$scope', 'appInfoValue', 'appInfoConstant', function($scope, appInfoValue,
appInfoConstant) {
$scope.value = appInfoValue.version;
$scope.const = appInfoValue.version;
}]);
Curso Front-End (AngularJS + Bootstrap) 56
Aula 06
AngularJS // Views
+
Curso Front-End (AngularJS + Bootstrap)
AngularJS // Views
O que é?
Até agora vimos diversas Views, pois elas nada mais são que
estruturas HTML que podem ou não ter Diretivas
customizadas e comportamentos especificos
As Views possuem diversos comportamentos que ajudam na
criação dos aplicativos, como:
Templates
Rotas
Filters
Forms
Entre outros
Curso Front-End (AngularJS + Bootstrap) 58
AngularJS // Views
Directive ng-view
O AngularJS suporta o conteúdo de Single Page Application
(SPA) por meio de múltiplas Views em uma única página
Uma View é no código a diretiva ng-view ou data-ng-view
como vimos nas aulas anteriores
Exemplo de definição de uma View:
<div ng-app="mainApp">
...
<div ng-view></div>
</div>
Curso Front-End (AngularJS + Bootstrap) 59
AngularJS // Views
Directive ng-template
A diretiva ng-template é usada para criar uma View HTML
dentro de uma tag script como o exemplo abaixo:
<div ng-app="mainApp">
...
<script type="text/ng-template" id="addStudent.htm">
<h2> Add Student </h2>
{{message}}
</script>
</div>
Curso Front-End (AngularJS + Bootstrap) 60
AngularJS // Views
Serviço $routeProvider
O routeProvider é um serviço chave que é configurado com
todas as URLs do sistema, mapeando todas elas para uma
View correspondente ou para um Template e atribuindo um
Controller a este caminho
$routeProvider.when('/addStudent', {
templateUrl: 'addStudent.htm',
controller: 'AddStudentController'
}).when('/viewStudents', {
templateUrl: 'viewStudents.htm',
controller: 'ViewStudentsController'
}).otherwise({
redirectTo: '/addStudent'
});
Curso Front-End (AngularJS + Bootstrap) 61
AngularJS // Views
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular-route.min.js"></script>
<div ng-app="mainApp">
<p><a href="#addStudent">Add Student</a></p> <p><a href="#viewStudents">View Students</a></p>
<div ng-view></div>
<script type="text/ng-template" id="addStudent.htm"><h2> Add Student </h2> {{message}}</script>
<script type="text/ng-template" id="viewStudents.htm"><h2>View Students</h2> {{message}}</script>
</div>
<script>
var mainApp = angular.module("mainApp", ['ngRoute']);
mainApp.config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/addStudent', {
templateUrl: 'addStudent.htm',
controller: 'AddStudentController'
}).when('/viewStudents', {
templateUrl: 'viewStudents.htm',
controller: 'ViewStudentsController'
}).otherwise({
redirectTo: '/addStudent'
});
}]);
mainApp.controller('AddStudentController', function($scope) {
$scope.message = "TEXTO DO AddStudentController";
});
mainApp.controller('ViewStudentsController', function($scope) {
$scope.message = "TEXTO DO ViewStudentsController";
});
</script>
Curso Front-End (AngularJS + Bootstrap) 62
AngularJS // Views
Filters
Os Filters podem ser aplicados a expressões dentro de Views
usando a seguinte sintaxe:
{{ expression | filter }}
Um exemplo seria:
{{ 12 | currency }} // Saída: $12.00
Curso Front-End (AngularJS + Bootstrap) 63
AngularJS // Views
Filters (Cont.)
Os Filters podem ser aplicados no resultado de outro Filtro:
{{ expression | filter1 | filter2 | ... }}
Um Filter pode ter vários argumentos:
{{ expression | filter:argument1:argument2:... }}
Exemplo:
{{ 1234 | number:2 }} // Saída: 1,234.00
Curso Front-End (AngularJS + Bootstrap) 64
AngularJS // Views
Filters em Controllers, Services e Directives
Para isso, injete uma dependência com o nome
<filterName>Filtro em seu Controller/Service/Directive
Por exemplo: um filtro chamado number é injetado usando o
numberFilter
Curso Front-End (AngularJS + Bootstrap) 65
AngularJS // Views
Filters em Controllers, Services e Directives (Cont.)
Exemplo utilizando filterFilter: ele é um filtro que cria uma
coleção filtrada a partir de outra coleção
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="FilterInControllerModule" ng-controller="FilterController as ctrl">
<div>
All entries:<span ng-repeat="entry in ctrl.array">{{entry.name}}</span>
</div>
<div>
Contain an "a": <span ng-repeat="entry in ctrl.filteredArray"> {{entry.name}}</span>
</div>
</div>
<script>
angular.module('FilterInControllerModule', []).
controller('FilterController', ['filterFilter', function(filterFilter) {
this.array = [{name: 'Tobias'}, {name: 'Jeff'}, { name: 'Brian' }, { name: 'Igor' }, { name: 'James' }, { name:
'Brad' }];
this.filteredArray = filterFilter(this.array, 'a');
}]);
</script>
Curso Front-End (AngularJS + Bootstrap) 66
AngularJS // Views
Filters Customizados
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-controller="MyController" ng-app="myReverseFilterApp">
<input ng-model="greeting" type="text"><br>No filter: {{greeting}}<br>Reverse: {{greeting|reverse}}<br>Reverse+uppercase: {{greeting|
reverse:true}}<br>Reverse,filtered in controller: {{filteredGreeting}}
</div>
<script>
angular.module('myReverseFilterApp', [])
.filter('reverse', function() {
return function(input, uppercase) {
input = input || '';
var out = "";
for (var i = 0; i < input.length; i++)
out = input.charAt(i) + out;
if (uppercase)
out = out.toUpperCase();
return out;
};
})
.controller('MyController', ['$scope', 'reverseFilter', function($scope, reverseFilter) {
$scope.greeting = 'hello';
$scope.filteredGreeting = reverseFilter($scope.greeting);
}]);
</script>
Curso Front-End (AngularJS + Bootstrap) 67
AngularJS // Views
Manipulação de DOM com Directives
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="">
<input type="checkbox" ng-model="enableDisableButton">Disable Button
<button ng-disabled="enableDisableButton">Click Me!</button><br/>
<input type="checkbox" ng-model="showHide1">Show Button
<button ng-show="showHide1">Click Me!</button><br/>
<input type="checkbox" ng-model="showHide2">Hide Button
<button ng-hide="showHide2">Click Me!</button><br/>
<p>Total click: {{clickCounter}}</p>
<button ng-click="clickCounter = clickCounter + 1">
Click Me!
</button>
</div>
Curso Front-End (AngularJS + Bootstrap) 68
AngularJS // Views
Forms
O AngularJS fornece vários eventos nativos que podem ser
associados a elementos HTML, seguem abaixo o eventos
suportados:
ng-click
ng-dbl-click
ng-mousedown
ng-mouseup
ng-mouseenter
ng-mouseleave
ng-mousemove
ng-mouseover
ng-keydown
ng-keyup
ng-keypress
ng-change
Curso Front-End (AngularJS + Bootstrap) 69
AngularJS // Views
Forms
Exemplo simples usando ng-click
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="myapp" ng-controller="studentController">
<input name="firstname" type="text" ng-model="firstName">
<input name="lastname" type="text" ng-model="lastName">
<button ng-click="reset()">Reset</button>
</div>
<script>
angular.module("myapp", [])
.controller("studentController", function($scope) {
$scope.reset = function() {
$scope.firstName = "Mahesh";
$scope.lastName = "Parashar";
}
$scope.reset();
});
</script>
Curso Front-End (AngularJS + Bootstrap) 70
AngularJS // Views
Forms
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-controller="ExampleController" ng-app="formExample">
<form novalidate class="simple-form">
Name: <input type="text" ng-model="user.name" /><br />
E-mail: <input type="email" ng-model="user.email" /><br />
<input type="button" ng-click="reset()" value="Reset" />
<input type="submit" ng-click="update(user)" value="Save" />
</form>
<pre>user = {{user | json}}</pre><pre>master = {{master | json}}</pre>
</div>
<script>
angular.module('formExample', [])
.controller('ExampleController', ['$scope', function($scope) {
$scope.master = {};
$scope.update = function(user) { $scope.master = angular.copy(user); };
$scope.reset = function() { $scope.user = angular.copy($scope.master); };
$scope.reset();
}]);
</script>
Curso Front-End (AngularJS + Bootstrap) 71
AngularJS // Views
Forms – Validações
Adicione esta folha de estilos no exemplo anterior:
<style type="text/css">
.simple-form input.ng-invalid.ng-touched {
background-color: #FA787E;
}
.simple-form input.ng-valid.ng-touched {
background-color: #78FA89;
}
</style>
E nos campos de nome e e-mail adione o atributo required:
Name: <input type="text" ng-model="user.name" required /><br />
E-mail: <input type="email" ng-model="user.email" required /><br />
Curso Front-End (AngularJS + Bootstrap) 72
AngularJS // Views
Forms – Validações (Cont.)
Altere os campos para o seguinte código:
Name: <input type="text" ng-model="user.name" name="uName" required="" /><br />
<div ng-show="form.$submitted || form.uName.$touched">
<div ng-show="form.uName.$error.required">Tell us your name.</div>
</div>
E-mail: <input type="email" ng-model="user.email" name="uEmail" required="" /><br />
<div ng-show="form.$submitted || form.uEmail.$touched">
<span ng-show="form.uEmail.$error.required">Tell us your email.</span>
<span ng-show="form.uEmail.$error.email">This is not a valid email.</span>
</div>
Altere o botão de reset para o seguinte código:
<input type="button" ng-click="reset(form)" value="Reset" />
Altere a função de reset para o seguinte código:
$scope.reset = function(form) {
if (form) {
form.$setPristine();
form.$setUntouched();
}
$scope.user = angular.copy($scope.master);
};
Curso Front-End (AngularJS + Bootstrap) 73
AngularJS // Views
Forms – Validações (Cont.)
Adicione o atributo name na tag form da seguinte maneira:
<form name="form" novalidate class="simple-form">
Curso Front-End (AngularJS + Bootstrap) 74
AngularJS // Views
Forms – Atualização de Form
Por padrão, qualquer alteração no conteúdo irá desencadear
uma atualização do modelo e validação de formulário. Você
pode substituir esse comportamento usando a diretiva
ngModelOptions
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="customTriggerExample" ng-controller="ExampleController">
<form>
Name: <input type="text" ng-model-options="{ updateOn: 'blur' }" ng-model="user.name" /><br />
Other data: <input type="text" ng-model="user.data" />
</form>
<pre>username = "{{user.name}}"</pre>
<pre>userdata = "{{user.data}}"</pre>
</div>
<script>
angular.module('customTriggerExample', [])
.controller('ExampleController', ['$scope', function($scope) { $scope.user = {}; }]);
</script>
Curso Front-End (AngularJS + Bootstrap) 75
AngularJS // Views
Forms – Atraso na Validação
É possível atrasar a atualização do modelo/validação usando a
chave debounce na diretiva ngModelOptions
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="debounceExample" ng-controller="ExampleController">
<form>
Name: <input type="text" ng-model="user.name" ng-model-options="{ debounce: 500 }" /><br />
</form>
<pre>username = "{{user.name}}"</pre>
</div>
<script>
angular.module('debounceExample', [])
.controller('ExampleController', ['$scope', function($scope) { $scope.user = {}; }]);
</script>
Outro exemplo de utilização seria:
ng-model-options="{ updateOn: 'default blur', debounce: { default: 500, blur: 0 } }"
Curso Front-End (AngularJS + Bootstrap) 76
AngularJS // Views
Forms – Validação Customizada
O AngularJS possui várias validações padrão utilizando HTML
5, são elas:
text
number
url
email
date
radio
checkbox
required
pattern
minlength
maxlength
min
max
Curso Front-End (AngularJS + Bootstrap) 77
AngularJS // Views
Forms – Validação Customizada (Cont.)
Se nenhuma das validações padrões atender é possível criar a
sua prórpia validação:
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<form name="form" ng-app="form-example1" class="css-form" novalidate>
Size (integer 0 - 10): <input type="number" ng-model="size" name="size" min="0" max="10" integer />{{size}}<br />
<span ng-show="form.size.$error.integer">The value is not a valid integer!</span><span ng-show="form.size.$error.min ||
form.size.$error.max">The value must be in range 0 to 10!</span>
</form>
<script>
var INTEGER_REGEXP = /^\-?\d+$/;
var app = angular.module('form-example1', []).directive('integer', function() { return {
require: 'ngModel',
link: function(scope, elm, attrs, ctrl) {
ctrl.$validators.integer = function(modelValue, viewValue) {
if (ctrl.$isEmpty(modelValue))
return true;
if (INTEGER_REGEXP.test(viewValue))
return true;
return false;
}; } }; });
</script>
Curso Front-End (AngularJS + Bootstrap) 78
Aula 07
Requisições AJAX
+
Curso Front-End (AngularJS + Bootstrap)
AngularJS // Requisições AJAX
O que é?
O AngularJS prove um controle de requisições asincronas via
HTTP(s) que funciona como um serviço para ler dados a partir
do servidor
O Angularjs precisa de um retorno com dados em formato
JSON
Segue um exemplo:
...
$http.get(url).success( function(response) {
$scope.students = response;
});
...
Curso Front-End (AngularJS + Bootstrap) 80
AngularJS // Requisições AJAX
Uso comum
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="myapp" ng-controller="ajaxController">
{{retorno}}
</div>
<script>
angular.module("myapp", [])
.controller("ajaxController", ['$scope', '$http', function($scope, $http) {
$http({
method: 'GET',
url: 'http://10.200.232.59/rest-data/data.php'
}).then(function successCallback(response) {
$scope.retorno = response;
console.log(response.data);
}, function errorCallback(response) {
$scope.retorno = response;
console.log(response.data);
});
}]);
</script>
Curso Front-End (AngularJS + Bootstrap) 81
AngularJS // Requisições AJAX
Outras Operações
$http.get
$http.head
$http.post
$http.put
$http.delete
$http.jsonp
$http.patch
Curso Front-End (AngularJS + Bootstrap) 82
AngularJS // Requisições AJAX
<script
src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<div ng-app="httpExample" ng-controller="FetchController">
<select ng-model="method" aria-label="Request
method"><option>GET</option><option>JSONP</option></select>
<input type="text" ng-model="url" size="80" aria-label="URL" />
<button id="fetchbtn" ng-click="fetch()">fetch</button>
<button id="samplegetbtn" ng-click="updateModel('GET', 'http://10.200.232.59/rest-
data/data.php')">Sample GET</button>
<button id="samplejsonpbtn" ng-click="updateModel('JSONP',
'https://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super
%20Hero')">
Sample JSONP
</button>
<pre>http status code: {{status}}</pre><pre>http response data: {{data}}</pre>
</div>
Curso Front-End (AngularJS + Bootstrap) 83
AngularJS // Requisições AJAX
<script>
angular.module('httpExample', [])
.controller('FetchController', ['$scope', '$http', function($scope, $http) {
$scope.fetch = function() {
$scope.code = null;
$scope.response = null;
$http({
method: $scope.method,
url: $scope.url
}).then(function(response) {
$scope.status = response.status;
$scope.data = response.data;
}, function(response) {
$scope.data = response.data || "Request failed";
$scope.status = response.status;
});
};
$scope.updateModel = function(method, url) {
$scope.method = method;
$scope.url = url;
}; } ]);
</script>
Curso Front-End (AngularJS + Bootstrap) 84
Aula 08
Armazenamento Local
+
Curso Front-End (AngularJS + Bootstrap)
Armazenamento Local
O que é?
Um recurso do HTML5 permite salvar dados localmente no
navegador utilizando:
Local Storage: armazena dados sem data de expiração.
Armazenamento chave-valor, contudo no campo valor podemos
armazenar até 5MB de dados, podendo ser uma estutura JSON
http://www.w3.org/TR/webstorage/
Session Storage: armazena dados para uma sessão (os dados são
perdidos quando a aba do navegador é fechada)
http://www.w3.org/TR/webstorage/
Cookie: armazena pequena quantidade de dados com data de
expiração
Web SQL Database: também é possível armazenar localmente
utilizando uma base de dados SQL
http://dev.w3.org/html5/webdatabase/
Curso Front-End (AngularJS + Bootstrap) 86
Armazenamento Local
Como usar?
Todo o processo pode ser feito manualmente acessando o
objeto de armazenamento local do HTML5
Outra opção é utilizar alguma extenção do AngularJS para nos
poupar trabalho
Iremos utilizar a extenção angular-local-storage
Curso Front-End (AngularJS + Bootstrap) 87
Armazenamento Local
angular-local-storage
Toda a documentação do funcionamento dela pode ser
encontrado no endereço:
https://github.com/grevory/angular-local-storage
Curso Front-End (AngularJS + Bootstrap) 88
Armazenamento Local
angular-local-storage - Exemplo
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-local-storage/0.2.2/angular-local-storage.min.js"></script>
<div ng-app="myApp" ng-controller="MainCtrl">
<input type="text" ng-model="chave" />
<input type="text" ng-model="valor" />
<input type="button" ng-click="save(chave, valor)" value="Salvar" />
<input type="button" ng-click="restore(chave)" value="Recuperar" />
</div>
<script>
var myApp = angular.module('myApp', ['LocalStorageModule']);
myApp.controller('MainCtrl', function($scope, localStorageService) {
$scope.save = function(chave, valor) {
localStorageService.set(chave, valor);
}
$scope.restore = function(chave) {
$scope.valor = localStorageService.get(chave);
}
});
</script>
Curso Front-End (AngularJS + Bootstrap) 89
Aula 09
Bootstrap e Responsividade
+
Curso Front-End (AngularJS + Bootstrap)
Bootstrap e Responsividade
O que é?
Bootstrap: é o mais popular framework HTML, CSS, e JS para
desenvolvimento de projetos responsivo e focado para
dispositivos móveis na web.
Curso Front-End (AngularJS + Bootstrap) 91
Bootstrap e Responsividade
O que é?
Responsividade: Um site responsivo muda a sua aparência e
disposição com base no tamanho da tela em que o site é
exibido. Então, se o usuário tem uma tela pequena, os
elementos se reorganizam para lhe mostrar as coisas principais
em primeiro lugar.
Curso Front-End (AngularJS + Bootstrap) 92
Bootstrap e Responsividade
Curso Front-End (AngularJS + Bootstrap) 93
Bootstrap e Responsividade
Como usar o bootstrap
Basta adicionar alguns arquivos externos no seu HTML
<!-- Última versão CSS compilada e minificada -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<!-- Tema opcional -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
<!-- Última versão JavaScript compilada e minificada -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
Curso Front-End (AngularJS + Bootstrap) 94
Bootstrap e Responsividade
Como usar o bootstrap
Adicione os seus elementos HTML
<div class="container">
<form class="form-signin">
<h2 class="form-signin-heading">Please sign in</h2>
<label for="inputEmail" class="sr-only">Email address</label>
<input type="email" id="inputEmail" class="form-control" placeholder="Email">
<label for="inputPassword" class="sr-only">Password</label>
<input type="password" id="inputP" class="form-control" placeholder="Password">
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
</form>
</div>
Curso Front-End (AngularJS + Bootstrap) 95
Bootstrap e Responsividade
Como usar o bootstrap (Cont.)
Altere o Tema
<link rel="stylesheet" href="https://bootswatch.com/paper/bootstrap.css">
Curso Front-End (AngularJS + Bootstrap) 96
Bootstrap e Responsividade
Grid System
É um sistema de grid que foca no desenvolvimento orientado
a dispositivos móveis e que dimensiona adequadamente 12
colunas com o tamanho do dispositivo ou tamanho de tela do
usuário.
Ele inclui classes pré-definidas para as opções de layout
facilitando o desenvolvimento
Curso Front-End (AngularJS + Bootstrap) 97
Bootstrap e Responsividade
Grid System
Características basicas
As linhas devem ser colocadas dentro de uma DIV com a classe
.container (fixed-width) OU .container-fluid (full-width) para um
alinhamento correto
Use linhas para criar grupos horizontais de colunas
O conteúdo deve ser colocado dentro de colunas, e somente as
colunas podem ser elementos filhos de linhas
Curso Front-End (AngularJS + Bootstrap) 98
Bootstrap e Responsividade
Grid System
Tamanhos de tela suportados
Extra small devices (<768px)
.col-xs-
Small devices Tablets (≥768px)
.col-sm-
Medium devices (≥992px)
.col-md-
Large devices Desktops (≥1200px)
.col-lg-
Curso Front-End (AngularJS + Bootstrap) 99
Bootstrap e Responsividade
Grid System - Exemplo
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"/>
<hr>
<div class="container">
<div class="visible-lg"><span class="label label-default">lg</span></div>
<div class="visible-md"><span class="label label-default">md</span></div>
<div class="visible-sm"><span class="label label-default">sm</span></div>
<div class="visible-xs"><span class="label label-default">xs</span></div>
</div>
<hr>
<div class="container">
<div class="row">
<div class="col-xs-8 col-md-4">col-xs-8 col-md-4</div>
<div class="col-xs-4 col-md-8">col-xs-4 col-md-8</div>
</div>
</div>
<hr>
<div class="container">
<div class="row">
<div class="col-xs-6 col-sm-8">col-xs-6 col-sm-8</div>
<div class="col-xs-6 col-sm-4">col-xs-6 col-sm-4</div>
</div>
</div>
Curso Front-End (AngularJS + Bootstrap) 100
Bootstrap e Responsividade
Grid System
Mais informações sobre o funcionamento do Grid podem ser
encontrados no seguinte endereço:
http://getbootstrap.com/css/#grid
Curso Front-End (AngularJS + Bootstrap) 101
Bootstrap e Responsividade
Botões - Cores
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"/>
<button type="button" class="btn btn-default">Default</button>
<button type="button" class="btn btn-primary">Primary</button>
<button type="button" class="btn btn-success">Success</button>
<button type="button" class="btn btn-info">Info</button>
<button type="button" class="btn btn-warning">Warning</button>
<button type="button" class="btn btn-danger">Danger</button>
<button type="button" class="btn btn-link">Link</button>
Curso Front-End (AngularJS + Bootstrap) 102
Bootstrap e Responsividade
Botões - Tamanhos
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
<p>
<button type="button" class="btn btn-primary btn-lg">Large button</button>
</p>
<p>
<button type="button" class="btn btn-primary">Default button</button>
</p>
<p>
<button type="button" class="btn btn-primary btn-sm">Small button</button>
</p>
<p>
<button type="button" class="btn btn-primary btn-xs">Extra small button</button>
</p>
Curso Front-End (AngularJS + Bootstrap) 103
Bootstrap e Responsividade
Botões
Mais informações podem ser encontrados no seguinte
endereço:
http://getbootstrap.com/css/#buttons
Curso Front-End (AngularJS + Bootstrap) 104
Bootstrap e Responsividade
Formulários
Os campos mais comuns suportados pelo HTML5 são: text,
password, datetime, datetime-local, date, month, time, week,
number, email, url, search, tel, and color
Por padrão os campos assumiram o tamanho da coluna que
ele foi colocado
Curso Front-End (AngularJS + Bootstrap) 105
Bootstrap e Responsividade
Formulários
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
<form>
<div class="form-group">
<label for="exampleInputEmail1">Email address</label>
<input type="email" class="form-control" placeholder="Email">
</div>
<div class="form-group">
<label for="exampleInputPassword1">Password</label>
<input type="password" class="form-control" placeholder="Password">
<p class="help-block">Example block-level help text here.</p>
</div>
<button type="button" class="btn btn-default">Submit</button>
</form>
Curso Front-End (AngularJS + Bootstrap) 106
Bootstrap e Responsividade
Formulários
Mais informações podem ser encontrados no seguinte
endereço:
http://getbootstrap.com/css/#forms
Curso Front-End (AngularJS + Bootstrap) 107
Bootstrap e Responsividade
Classes Auxiliares
Cores de Fonte para Contextos
<p class="text-primary">...</p>
<p class="text-success">...</p>
Cores de Fundo para Contextos
<p class="bg-success">...</p>
<p class="bg-info">...</p>
Cores de Fundo para Contextos
<div class="center-block">...</div>
Curso Front-End (AngularJS + Bootstrap) 108
Bootstrap e Responsividade
Classes Auxiliares
Mais informações podem ser encontrados no seguinte
endereço:
http://getbootstrap.com/css/#helper-classes
Curso Front-End (AngularJS + Bootstrap) 109
Bootstrap e Responsividade
Utilidades para Responsividade
Para um desenvolvimento rápido de aplicações amigáveis para
dispositivos móveis, existem classes CSS para mostrar e
ocultar o conteúdo de acordo com o tamanho da tela do
dispositivo.
Também existem classes CSS para alternar conteúdo quando
impresso
Curso Front-End (AngularJS + Bootstrap) 110
Bootstrap e Responsividade
Utilidades para Responsividade
Mostrando/Ocultando conteúdos
Curso Front-End (AngularJS + Bootstrap) 111
Bootstrap e Responsividade
Utilidades para Responsividade
Mostrando/Ocultando conteúdos para impressão
Curso Front-End (AngularJS + Bootstrap) 112
Bootstrap e Responsividade
Utilidades para Responsividade
Mais informações podem ser encontrados no seguinte
endereço:
http://getbootstrap.com/css/#responsive-utilities
Curso Front-End (AngularJS + Bootstrap) 113
Aula 09
Projeto Final
+
Curso Front-End (AngularJS + Bootstrap)
Projeto Final
Requisitos
Layout Responsivo
HEADER
Acessar a API REST
Funcionalidades
Listar Bookmarks
Adicionar Bookmark
Alterar Bookmark
MENU
Excluir Bookmark Início CONTENT
Listagem
Adicionar
Curso Front-End (AngularJS + Bootstrap) 115
Projeto Final
Ambiente de Desenvolvimento
Eclipse Luna
http://www.eclipse.org/downloads/download.php?file=/technology/epp/
downloads/release/luna/SR2/eclipse-java-luna-SR2-linux-gtk.tar.gz
Jboss 7.1.1.Final
Curso Front-End (AngularJS + Bootstrap) 116
Projeto Final
Criação do Projeto
Configurando o Arquetipo Demoiselle no Eclipse
Acesse o menu Window > Preferences
Abra o menu lateral Maven > Archetypes
Clique no botão Add Remote Catalog
No campo Catalog File informe:
http://demoiselle.sourceforge.net/repository/archetype-catalog.xml
No campo Description:
Demoiselle
Clique em OK
Curso Front-End (AngularJS + Bootstrap) 117
Projeto Final
Criação do Projeto
Configurando o Servidor JBoss
Acesse o menu superior Window > Show View > Servers
Curso Front-End (AngularJS + Bootstrap) 118
Projeto Final
Criação do Projeto
Configurando o Servidor JBoss
Clique no link “No servers are avaliable. Click this link...”
Filtre e escolha o item Jboss AS 7.1
Clique em Next
Clique novamente em Next
No campo Home Directory escolha o caminho da pasta do Jboss
descompactada
Clique em Finish
Curso Front-End (AngularJS + Bootstrap) 119
Projeto Final
Criação do Projeto
Novo Projeto
Acesse o menu superior no item File > New > Other...
Procure por Maven Project
Clique em Next
Next novamente
Escolha o catálogo Demoiselle e filtre por rest
Clique em Next
No group id informe br.gov.serpro
No Artifact id informe projetofinal
Clique em Finish
Curso Front-End (AngularJS + Bootstrap) 120
Projeto Final
Criação do Projeto
Após a criação a aba Project Explorer ficará assim:
Curso Front-End (AngularJS + Bootstrap) 121
Projeto Final
Limpando do Projeto
Vamos excluir alguns
arquivos e pastas que não
são necessários
Deixe o seu projeto com a
árvore de diretórios igual a
imagem ao lado
Curso Front-End (AngularJS + Bootstrap) 122
Projeto Final
Retirando a obrigatoriedade de Login
No projeto não iremos abordar as questões de login, por isso é
necessário que na classe BookmarkREST dentro do pacote
br.gov.serpro.projetofinal.rest todas as anotações @LoggedIn
sejam comentadas ou excluídas para que o projeto funcione
corretamente
Curso Front-End (AngularJS + Bootstrap) 123
Projeto Final
HTML do index.html
Vamos utilizar as
bibliotecas como
<!DOCTYPE html>
<html> recursos externos de
<head>
<meta charset="utf-8">
outros servidores
<title>Projeto Final</title>
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
<!-- Bootstrap CSS Theme -->
<link rel="stylesheet" href="https://bootswatch.com/paper/bootstrap.css">
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="#/">Projeto Final</a>
</div>
</div>
</nav>
<!-- Libs (JQuery, Angular, Bootstrap) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</body>
</html>
Curso Front-End (AngularJS + Bootstrap) 124
Projeto Final
Publicação no JBoss
Clique com o botão direito sobre o projeto e acesse o menu
Run as > Run on Server
Escolha o servidor Jboss
Clique em Finish
O index.html estará disponível no endereço:
http://localhost:8080/projetofinal/
O ideal é acessar pelo navegador Chromium ou Chrome
Curso Front-End (AngularJS + Bootstrap) 125
Projeto Final
Configurando o App AngularJS
Crie um arquivo app.js na raíz da pasta scripts com o seguinte
conteúdo
'use strict';
var app = angular.module('projetofinal', ['ngRoute']);
app.config(['$routeProvider', function ($routeProvider) {
$routeProvider.when('/home', {
templateUrl: 'views/home.html',
controller: 'HomeController',
})
.when('/add', {
templateUrl: 'views/add.html',
controller: 'AddController',
})
.when('/list', {
templateUrl: 'views/list.html',
controller: 'ListController',
})
.when('/edit/:id', {
templateUrl: 'views/add.html', // Vamos reutilizar a tela
controller: 'EditController',
})
.otherwise({
redirectTo: '/home',
});
}]);
Curso Front-End (AngularJS + Bootstrap) 126
Projeto Final
Route Provider
Como iremos utilizar o Route Provider é necessário incluir um
outro componente do AngularJS da seguinte maneira:
...
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<!-- Route Provider -->
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular-route.min.js"></script>
</body>
...
Curso Front-End (AngularJS + Bootstrap) 127
Projeto Final
Configuração
Adicionando o JS app.js
...
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular-route.min.js"></script>
<!-- Main -->
<script src="scripts/app.js"></script>
</body>
...
Curso Front-End (AngularJS + Bootstrap) 128
Projeto Final
Configuração
Adicionando o atributo ng-app no HTML
Troque a linha:
<html>
Por
<html ng-app="projetofinal">
Curso Front-End (AngularJS + Bootstrap) 129
Projeto Final
HTML do Menu
Adicione o seguinte trecho de código no index.html para criar
o menu e o local aonde será inserido o html das suas páginas
acessadas:
...
</nav>
<div class="container-fluid">
<div class="row">
<div class="col-sm-3 col-md-2">
MENU
</div>
<div class="col-sm-9 col-md-10" ng-view></div>
</div>
</div>
<!-- Libs (JQuery, Angular, Bootstrap) -->
...
Curso Front-End (AngularJS + Bootstrap) 130
Projeto Final
Primeira Tela
Criando a tela home
Adicione o arquivo home.js na raíz da pasta /scripts/controllers com o
seguinte conteúdo:
'use strict';
app.controller('HomeController', [ '$scope', function($scope) {
$scope.title = "Olá! Esta é a tela principal do sistema!";
}]);
Crie o arquivo home.html na raíz da pasta /views com o seguinte
conteúdo:
{{title}}
Adicione o arquivo home.js ao HTML do index.html:
...
<script src="scripts/app.js"></script>
<!-- Controllers -->
<script src="scripts/controllers/home.js"></script>
</body>
...
Adicione
...
a seguinte linha
<link rel="stylesheet" href="https://bootswatch.com/paper/bootstrap.css">
<style> .sidebar, .main { top: 75px; } </style>
</head>
...
Curso Front-End (AngularJS + Bootstrap) 131
Projeto Final
Listagem - Criação da tela
Copie o arquivo home.js para list.js e altere o que for
necessário
Copie o arquivo home.html para list.html
Adicione o arquivo list.js logo abaixo do home.js dentro do
HTML do index.html
Substitua o conteúdo do menu pelo seguinte código:
<div class="row">
<div class="col-sm-3 col-md-2 sidebar">
<ul class="nav nav-sidebar">
<li><a href="#/home">Início</a></li>
<li><a href="#/list">Listagem</a></li>
<li><a href="#/add">Adicionar</a></li>
</ul>
</div>
<div class="col-sm-9 col-md-10 main" ng-view></div>
</div>
Publique o projeto e visualise o resultado no navegador
Curso Front-End (AngularJS + Bootstrap) 132
Projeto Final
Situação Atual
Curso Front-End (AngularJS + Bootstrap) 133
Projeto Final
Listagem – Criação do Serviço
Crie o arquivo bookmark.js na raíz da pasta /scripts/services
com o seguinte conteúdo
'use strict';
app.factory('BookmarkService', [ '$http', '$q', function($http, $q) {
var services = {};
services.findAll = function() {
var deferred = $q.defer();
$http({
url : 'api/bookmark',
method : "GET",
}).success(function(data) {
deferred.resolve(data);
}).error(function(data, status) {
deferred.reject([ data, status ]);
});
return deferred.promise;
};
return services;
} ]);
Curso Front-End (AngularJS + Bootstrap) 134
Projeto Final
Listagem – Criação do Serviço
Adicione o arquivo bookmark.js do serviço BookmarkService
ao index.html
<script src="scripts/controllers/list.js"></script>
<!-- Services -->
<script src="scripts/services/bookmark.js"></script>
</body>
Curso Front-End (AngularJS + Bootstrap) 135
Projeto Final
Listagem – Tabela HTML
Substitua TODO o conteúdo do arquivo /views/list.html para
o seguinte:
<h3>{{title}} <small>Listagem de todos os bookmarks cadastrados</small></h3>
<hr />
<button class="btn btn-primary" data-ng-click="new()">
<i class="glyphicon glyphicon-plus-sign"></i> Novo
</button>
<br/><br/>
<table class="table table-striped table-condensed">
<thead>
<tr>
<th>#</th>
<th width="30%">Description</th>
<th width="70%">Link</th>
<th></th>
</tr>
</thead>
<tbody>
<tr data-ng-repeat="b in bookmarks">
<th scope="row">{{b.id}}</th>
<td>{{b.description}}</td>
<td>{{b.link}}</td>
<td class="text-nowrap">
<a data-ng-click="edit(b.id)" class="btn btn-warning btn-xs">Alterar</a>
<a data-ng-click="delete(b.id)" class="btn btn-danger btn-xs">Excluir</a>
</td>
</tr>
</tbody>
</table>
Curso Front-End (AngularJS + Bootstrap) 136
Projeto Final
Listagem – Controller
Substitua TODO o conteúdo do arquivo
/scripts/controllers/list.js para o seguinte:
'use strict';
app.controller('ListController', [ '$scope', '$location', 'BookmarkService',
function($scope, $location, BookmarkService) {
$scope.title = "LISTAGEM";
$scope.new = function () {
$location.path('/add');
};
function findAll() {
BookmarkService.findAll().then(
function (data) {
$scope.bookmarks = data;
},
function (error) {
alert("Ocorreu um erro na requisição");
}
);
}
findAll();
}]);
Publique novamente no JBoss e visualiza no navegador
Curso Front-End (AngularJS + Bootstrap) 137
Projeto Final
Situação Atual
Curso Front-End (AngularJS + Bootstrap) 138
Projeto Final
Adicionar - Criação da tela
Copie o arquivo home.js para add.js altere o que for
necessário
Copie o arquivo home.html para add.html
Adicione o arquivo add.js logo abaixo do list.js dentro do
HTML do index.html
Publique o projeto e visualise o resultado no navegador
Curso Front-End (AngularJS + Bootstrap) 139
Projeto Final
Adicionar – Form
Substitua TODO o conteúdo do arquivo /views/add.html:
<h3>{{title}} <small>Gestão do bookmark</small></h3>
<hr />
<form name="form" novalidate>
<div class="form-group row" ng-show="bookmark.id != undefined">
<div class="col-md-2">
<input class="form-control" disabled="disabled" type="text" ng-model="bookmark.id">
</div>
</div>
<div class="form-group">
<input name="uDescription" required type="text" class="form-control" ng-model="bookmark.description"
placeholder="Description">
<div ng-show="form.$submitted || form.uDescription.$touched" class="has-error">
<div class="help-block" ng-show="form.uDescription.$error.required">Tell us the bookmark description</div>
</div>
</div>
<div class="form-group">
<input type="url" class="form-control" required name="uUrl" placeholder="URL" ng-model="bookmark.link">
<div ng-show="form.$submitted || form.uUrl.$touched" class="has-error">
<span class="help-block" ng-show="form.uUrl.$error.required">Tell us the URL of bookmark.</span>
<span class="help-block" ng-show="form.uUrl.$error.url">This is not a valid URL.</span>
</div>
</div>
<button type="submit" class="btn btn-default" ng-click="save()">Submit</button>
</form>
Curso Front-End (AngularJS + Bootstrap) 140
Projeto Final
Adicionar – Form
Adicione a função save no serviço do Bookmark
...
return deferred.promise;
};
services.save = function(bookmark) {
var deferred = $q.defer();
var id = bookmark.id;
bookmark.id = null;
$http({
url: id ? 'api/bookmark/' + id : 'api/bookmark',
method: id ? "PUT" : "POST",
data: bookmark,
headers: {
'Content-Type': 'application/json;charset=utf8'
}
}).success(function(data) {
deferred.resolve(data);
}).error(function(data, status) {
deferred.reject([data, status]);
});
return deferred.promise;
};
return services;
...
Curso Front-End (AngularJS + Bootstrap) 141
Projeto Final
Adicionar – Form
Substitua TODO o conteúdo do arquivo add.js por:
'use strict';
app.controller('AddController', ['$scope', '$location', 'BookmarkService',
function($scope, $location, BookmarkService) {
$scope.title = "Adicionar Bookmark";
$scope.bookmark = {};
$scope.save = function () {
if ($scope.form.$valid) {
BookmarkService.save($scope.bookmark).then(
function (data) {
alert('Bookmark salvo com sucesso');
$location.path('/list');
},
function (error) {
console.log(error);
alert('Erro ao salvar o Bookmark');
}
);
}
};
}]);
Curso Front-End (AngularJS + Bootstrap) 142
Projeto Final
Alterar
Copie o arquivo home.js para edit.js altere o que for
necessário
Adicione o arquivo edit.js logo abaixo do add.js dentro do
HTML do index.html
Curso Front-End (AngularJS + Bootstrap) 143
Projeto Final
Alterar
Adicione a seguinte função ao ListController
$scope.edit = function (id) {
$location.path('/edit/' + id);
};
Curso Front-End (AngularJS + Bootstrap) 144
Projeto Final
Adicionar
Substitua TODO o conteúdo do arquivo edit.js por:
'use strict';
app.controller('EditController', ['$scope', '$location', '$routeParams', 'BookmarkService',
function($scope, $location, $routeParams, BookmarkService) {
$scope.title = "Editar Bookmark";
var id = $routeParams.id;
BookmarkService.get(id).then(
function (data) {
$scope.bookmark = data;
},
function (error) {
alert('Erro ao pegar Bookmark do servidor');
}
);
$scope.save = function () {
if ($scope.form.$valid) {
BookmarkService.save($scope.bookmark).then(
function (data) {
alert('Bookmark salvo NOVAMENTE com sucesso');
$location.path('/list');
},
function (error) {
console.log(error);
alert('Erro ao salvar NOVAMENTE o Bookmark');
}
);
}
};
}]);
Curso Front-End (AngularJS + Bootstrap) 145
Projeto Final
Adicionar
Adicione a função get no serviço do Bookmark
...
return deferred.promise;
};
services.get = function(id) {
var deferred = $q.defer();
$http({
url : 'api/bookmark/' + id,
method : "GET",
}).success(function(data) {
deferred.resolve(data);
}).error(function(data, status) {
deferred.reject([ data, status ]);
});
return deferred.promise;
};
return services;
...
Curso Front-End (AngularJS + Bootstrap) 146
Projeto Final
Remover
Adicione a seguinte função ao ListController
$scope.delete = function (id) {
BookmarkService.delete(id).then(
function (data) {
findAll();
},
function (error) {
alert("Ocorreu um erro na requisição");
}
);
};
Curso Front-End (AngularJS + Bootstrap) 147
Projeto Final
Remover
Adicione a função delete no serviço do Bookmark
...
return deferred.promise;
};
services.delete = function(id) {
var deferred = $q.defer();
$http({
url: 'api/bookmark/' + id,
method: "DELETE"
}).success(function(data) {
deferred.resolve(data);
}).error(function(data, status) {
deferred.reject([data, status]);
});
return deferred.promise;
};
return services;
...
Curso Front-End (AngularJS + Bootstrap) 148
Fim!
Julian Cesar
[email protected] http://juliancesar.com.br
+
Curso Front-End (AngularJS + Bootstrap)