SlideShare uma empresa Scribd logo
Abraçando o MVC Client Side
Sergio Azevedo
sergio.junior@caelum.com.br
@sergioazevedo
http://sagadoprogramador.com.br
Saturday, October 19, 13
Arquitetura “padrão”
de uma Aplicação Web
Server Side
Client Side

h

uest
p req
tt

htt
pr
esp
on

Controlador

View
Template

se
html / json /xml

Saturday, October 19, 13

Modelo
View
Renderizada
Então qual o problema?
Saturday, October 19, 13
Qual o problema?
JQuery resolve isso muito bem
Saturday, October 19, 13
“A necessidade de um framework
MVC client-side, fica clara quando
você começa a manipular em suas
páginas, não só HTML mas também
dados.”

fonte: http://jster.net
http://jster.net/blog/why-should-you-use-client-side-mvc-framework#.UmH4-ZTwIjE

Saturday, October 19, 13
E o framework MVC
client-side que veremos hoje será:

Saturday, October 19, 13
VISÃO GERAL

Saturday, October 19, 13
VISÃO GERAL
• Framework

Saturday, October 19, 13

MVC Javascript, para aplicações web dinamicas
VISÃO GERAL
• Framework
• Suporta

Saturday, October 19, 13

MVC Javascript, para aplicações web dinamicas

HTML 5
VISÃO GERAL
• Framework

MVC Javascript, para aplicações web dinamicas

• Suporta

HTML 5

• Extende

o HTML (Diretivas)

Saturday, October 19, 13
VISÃO GERAL
• Framework

MVC Javascript, para aplicações web dinamicas

• Suporta

HTML 5

• Extende

o HTML (Diretivas)

• Usa

abordagem declarativa para expressar logica nas views

Saturday, October 19, 13
VISÃO GERAL
• Framework

MVC Javascript, para aplicações web dinamicas

• Suporta

HTML 5

• Extende

o HTML (Diretivas)

• Usa

abordagem declarativa para expressar logica nas views

• Injeção

Saturday, October 19, 13

de dependencias (de graça)
VISÃO GERAL
• Framework

MVC Javascript, para aplicações web dinamicas

• Suporta

HTML 5

• Extende

o HTML (Diretivas)

• Usa

abordagem declarativa para expressar logica nas views

• Injeção
• Two

de dependencias (de graça)

way data binding

Saturday, October 19, 13
VISÃO GERAL
• Framework

MVC Javascript, para aplicações web dinamicas

• Suporta

HTML 5

• Extende

o HTML (Diretivas)

• Usa

abordagem declarativa para expressar logica nas views

• Injeção
• Two

de dependencias (de graça)

way data binding

• Mantido
Saturday, October 19, 13

pela Google
COMEÇANDO
<!doctype html>
<html ng-app>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/
1.0.8/angular.min.js"></script>
script>
</head>
<body>
<div>
<p>Digite seu nome: <input ng-model="nome" placeholder="Seu
nome aqui..."></p>
<p>{{nome}}</p>
</div>
</body>
</html>

Saturday, October 19, 13
COMEÇANDO
<!doctype html>
<html ng-app>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/
1.0.8/angular.min.js"></script>
script>
</head>
<body>
<div>
<p>Digite seu nome: <input ng-model="nome" placeholder="Seu
nome aqui..."></p>
<p>{{nome}}</p>
</div>
</body>
</html>

carrega o angular

Saturday, October 19, 13
COMEÇANDO
<!doctype html>
<html ng-app>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/
1.0.8/angular.min.js"></script>
script>
</head>
<body>
<div>
<p>Digite seu nome: <input ng-model="nome" placeholder="Seu
nome aqui..."></p>
<p>{{nome}}</p>
</div>
</body>
</html>

Saturday, October 19, 13
COMEÇANDO
<!doctype html>
<html ng-app> bootstrap do angular
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/
1.0.8/angular.min.js"></script>
script>
</head>
<body>
<div>
<p>Digite seu nome: <input ng-model="nome" placeholder="Seu
nome aqui..."></p>
<p>{{nome}}</p>
</div>
</body>
</html>

Saturday, October 19, 13
COMEÇANDO
<!doctype html>
<html ng-app>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/
1.0.8/angular.min.js"></script>
script>
</head>
<body>
<div>
<p>Digite seu nome: <input ng-model="nome" placeholder="Seu
nome aqui..."></p>
<p>{{nome}}</p>
</div>
</body>
</html>

Saturday, October 19, 13
COMEÇANDO
<!doctype html>
<html ng-app>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/
1.0.8/angular.min.js"></script>
script>
</head>
<body>
cria a variavel de modelo nome
<div>
<p>Digite seu nome: <input ng-model="nome" placeholder="Seu
nome aqui..."></p>
<p>{{nome}}</p>
</div>
</body>
</html>

Saturday, October 19, 13
COMEÇANDO
<!doctype html>
<html ng-app>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/
1.0.8/angular.min.js"></script>
script>
</head>
<body>
<div>
<p>Digite seu nome: <input ng-model="nome" placeholder="Seu
nome aqui..."></p>
<p>{{nome}}</p>
</div>
</body>
</html>

Saturday, October 19, 13
COMEÇANDO
<!doctype html>
<html ng-app>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/
1.0.8/angular.min.js"></script>
script>
</head>
<body>
<div>
<p>Digite seu nome: <input ng-model="nome" placeholder="Seu
nome aqui..."></p>
<p>{{nome}}</p> exibe o conteudo da variavel nome
</div>
</body>
</html>

Saturday, October 19, 13
COMEÇANDO
<!doctype html>
<html ng-app>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/
1.0.8/angular.min.js"></script>
script>
</head>
<body>
<div>
<p>Digite seu nome: <input ng-model="nome" placeholder="Seu
nome aqui..."></p>
<p>{{nome}}</p>
</div>
</body>
</html>

Saturday, October 19, 13
WORK FLOW BASICO

Saturday, October 19, 13
WORK FLOW BASICO
1. O browser recebe o html e faz executa o DOM parser

Saturday, October 19, 13
WORK FLOW BASICO
1. O browser recebe o html e faz executa o DOM parser
2. O browser carrega o script do angular.js

Saturday, October 19, 13
WORK FLOW BASICO
1. O browser recebe o html e faz executa o DOM parser
2. O browser carrega o script do angular.js
3. Angular busca pela diretiva ng-app

Saturday, October 19, 13
WORK FLOW BASICO
1. O browser recebe o html e faz executa o DOM parser
2. O browser carrega o script do angular.js
3. Angular busca pela diretiva ng-app
4. O angular cria o serviço de compilação da pagina ($compile)
e o escopo raiz ($rootScope)

Saturday, October 19, 13
WORK FLOW BASICO
1. O browser recebe o html e faz executa o DOM parser
2. O browser carrega o script do angular.js
3. Angular busca pela diretiva ng-app
4. O angular cria o serviço de compilação da pagina ($compile)
e o escopo raiz ($rootScope)
5. Angular usa o $compile para compilar o DOM e liga-lo ao
$rootScope. (HTML Compiler)

Saturday, October 19, 13
HTML COMPILER

Saturday, October 19, 13
HTML COMPILER
Compile: Percorre o DOM em busca de diretivas e entrega
como resultado uma função de link

Saturday, October 19, 13
HTML COMPILER
Compile: Percorre o DOM em busca de diretivas e entrega
como resultado uma função de link
Link: Combina as diretivas com o escopo ($scope) e gera
assim a visão. Qualquer atleração em um modelo de um
scope será refletida na visão, assim como qualquer interação
do usuario com a visão será refletida no scope.

Saturday, October 19, 13
HTML COMPILER
Compile: Percorre o DOM em busca de diretivas e entrega
como resultado uma função de link
Link: Combina as diretivas com o escopo ($scope) e gera
assim a visão. Qualquer atleração em um modelo de um
scope será refletida na visão, assim como qualquer interação
do usuario com a visão será refletida no scope.
“Two way data binding”

Saturday, October 19, 13
DIRETIVAS

Saturday, October 19, 13
DIRETIVAS

• São

o jeito angular de criar páginas dinamicas.

Saturday, October 19, 13
DIRETIVAS

• São

o jeito angular de criar páginas dinamicas.

• Angular

usa uma abordagem declarativa para expressar o
comportamento desejado dentro das views.

Saturday, October 19, 13
DIRETIVAS

• São

o jeito angular de criar páginas dinamicas.

• Angular

usa uma abordagem declarativa para expressar o
comportamento desejado dentro das views.

• Você

deve focar em descrever o comportamento desejado.

Saturday, October 19, 13
ALGUMAS DIRETIVAS

Saturday, October 19, 13
ALGUMAS DIRETIVAS
•

ng-app - bootstrap do angular

Saturday, October 19, 13
ALGUMAS DIRETIVAS
•

ng-app - bootstrap do angular

•

ng-model - define/associa uma nova variavel no escopo corrente

Saturday, October 19, 13
ALGUMAS DIRETIVAS
•

ng-app - bootstrap do angular

•

ng-model - define/associa uma nova variavel no escopo corrente

•

ng-init - incializar uma variavel atribuindo um valor

Saturday, October 19, 13
ALGUMAS DIRETIVAS
•

ng-app - bootstrap do angular

•

ng-model - define/associa uma nova variavel no escopo corrente

•

ng-init - incializar uma variavel atribuindo um valor

•

ng-repeat - o foreach do Angular

Saturday, October 19, 13
ALGUMAS DIRETIVAS
•

ng-app - bootstrap do angular

•

ng-model - define/associa uma nova variavel no escopo corrente

•

ng-init - incializar uma variavel atribuindo um valor

•

ng-repeat - o foreach do Angular

•

ng-click - registra um evento de click

Saturday, October 19, 13
ALGUMAS DIRETIVAS
•

ng-app - bootstrap do angular

•

ng-model - define/associa uma nova variavel no escopo corrente

•

ng-init - incializar uma variavel atribuindo um valor

•

ng-repeat - o foreach do Angular

•

ng-click - registra um evento de click

•

ng-disable - recebe uma expressão que se avaliada positivamente
desabilita o elemento.

Saturday, October 19, 13
ALGUMAS DIRETIVAS
•

ng-app - bootstrap do angular

•

ng-model - define/associa uma nova variavel no escopo corrente

•

ng-init - incializar uma variavel atribuindo um valor

•

ng-repeat - o foreach do Angular

•

ng-click - registra um evento de click

•

ng-disable - recebe uma expressão que se avaliada positivamente
desabilita o elemento.

•

ng-controller - delcara a criacao de um novo escopo de controlador.

Saturday, October 19, 13
Exemplo:
Exibir um text area e garantir que
o botao enviar so funcione
quando o usuario preencher no
minimo 10 caracteres

Saturday, October 19, 13
EXEMPLO DIRETIVAS
<!doctype html>
<html ng-app>
<head>
<script src="../angular.js"></script>
</head>
<body>
<div ng-init="descricao =''">
<textarea ng-model="descricao">{{descricao}}</textarea>
</div>
<p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p>
<div>
<button ng-disabled="descricao.length < 10">Enviar</button>
</div>
</body>
</html>

Saturday, October 19, 13
EXEMPLO DIRETIVAS
<!doctype html>
<html ng-app>
<head>
<script src="../angular.js"></script>
</head>
cria a variavel de descricao atribuindo o valor vazio
<body>
<div ng-init="descricao =''">
<textarea ng-model="descricao">{{descricao}}</textarea>
</div>
<p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p>
<div>
<button ng-disabled="descricao.length < 10">Enviar</button>
</div>
</body>
</html>

Saturday, October 19, 13
EXEMPLO DIRETIVAS
<!doctype html>
<html ng-app>
<head>
<script src="../angular.js"></script>
</head>
<body>
<div ng-init="descricao =''">
<textarea ng-model="descricao">{{descricao}}</textarea>
</div>
<p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p>
<div>
<button ng-disabled="descricao.length < 10">Enviar</button>
</div>
</body>
</html>

Saturday, October 19, 13
EXEMPLO DIRETIVAS
<!doctype html>
<html ng-app>
<head>
<script src="../angular.js"></script>
</head>
<body>
<div ng-init="descricao =''">
<textarea ng-model="descricao">{{descricao}}</textarea>
</div>

Associa o variavel ao conteudo do text area

<p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p>
<div>
<button ng-disabled="descricao.length < 10">Enviar</button>
</div>
</body>
</html>

Saturday, October 19, 13
EXEMPLO DIRETIVAS
<!doctype html>
<html ng-app>
<head>
<script src="../angular.js"></script>
</head>
<body>
<div ng-init="descricao =''">
<textarea ng-model="descricao">{{descricao}}</textarea>
</div>
<p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p>
<div>
<button ng-disabled="descricao.length < 10">Enviar</button>
</div>
</body>
</html>

Saturday, October 19, 13
EXEMPLO DIRETIVAS
<!doctype html>
<html ng-app>
<head>
<script src="../angular.js"></script>
</head>
<body>
<div ng-init="descricao =''">
<textarea ng-model="descricao">{{descricao}}</textarea>
</div>declara que a mensagem só pode ser exibida enquanto o

usuario nao digitar no minimo 10 caracteres

<p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p>
<div>
<button ng-disabled="descricao.length < 10">Enviar</button>
</div>
</body>
</html>

Saturday, October 19, 13
EXEMPLO DIRETIVAS
<!doctype html>
<html ng-app>
<head>
<script src="../angular.js"></script>
</head>
<body>
<div ng-init="descricao =''">
<textarea ng-model="descricao">{{descricao}}</textarea>
</div>
<p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p>
<div>
<button ng-disabled="descricao.length < 10">Enviar</button>
</div>
</body>
</html>

Saturday, October 19, 13
EXEMPLO DIRETIVAS
<!doctype html>
<html ng-app>
<head>
<script src="../angular.js"></script>
</head>
<body>
<div ng-init="descricao =''">
<textarea ng-model="descricao">{{descricao}}</textarea>
</div>
<p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p>
<div>
<button ng-disabled="descricao.length < 10">Enviar</button>
</div>
declara que o botao so deve estar habilitado se o
</body>
</html>
texo ultrapasar o minimo de 10 caracteres

Saturday, October 19, 13
EXEMPLO DIRETIVAS
<!doctype html>
<html ng-app>
<head>
<script src="../angular.js"></script>
</head>
<body>
<div ng-init="descricao =''">
<textarea ng-model="descricao">{{descricao}}</textarea>
</div>
<p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p>
<div>
<button ng-disabled="descricao.length < 10">Enviar</button>
</div>
</body>
</html>

Saturday, October 19, 13
CONTROLADORES

Saturday, October 19, 13
CONTROLADORES
• São

objetos Javascript convencionais

Saturday, October 19, 13
CONTROLADORES
• São

objetos Javascript convencionais

• Nao

precisam herdar de nenhuma classe

Saturday, October 19, 13
CONTROLADORES
• São

objetos Javascript convencionais

• Nao
• As

precisam herdar de nenhuma classe

responsabilidades de um controlador são:

Saturday, October 19, 13
CONTROLADORES
• São

objetos Javascript convencionais

• Nao
• As

precisam herdar de nenhuma classe

responsabilidades de um controlador são:

• Incializar

Saturday, October 19, 13

objetos do escopo ($scope). *(principal)
CONTROLADORES
• São

objetos Javascript convencionais

• Nao
• As

precisam herdar de nenhuma classe

responsabilidades de um controlador são:

• Incializar

objetos do escopo ($scope). *(principal)

• disponibilizar

comportamento para UI através de funções
ligadas ao $scope.

Saturday, October 19, 13
CONTROLADORES
• São

objetos Javascript convencionais

o de
o us
itar
• Nao precisam herdare ev
ça s el
ev de nenhumaaclasseo
cê d init. Fa
Vo
mod
nges de adores
zaçõ controlador são:
• As responsabilidadeslde um ntrol
cia i e co
ini
tro d
den
• Incializar objetos do escopo ($scope). *(principal)

• disponibilizar

comportamento para UI através de funções
ligadas ao $scope.

Saturday, October 19, 13
EXEMPLO USANDO CONTROLLER
arquivo index2.html:
<!doctype html>
<html ng-app>
<head>
<script src="../angular.js"></script>
<script src="message-controller.js"></script>
</head>
<body ng-controller="MessageController">
<div>
<textarea ng-model="descricao">{{descricao}}</textarea>
</div>
<p ng-show='naoTemQuantidadeMinimaDeCaractres()'>Minimo de 10
caracteres</p>
<div>
<button ngdisabled="naoTemQuantidadeMinimaDeCaractres()">Enviar</button>
</div>
</body>
</html>

Saturday, October 19, 13
EXEMPLO USANDO CONTROLLER
arquivo index2.html:
<!doctype html>
<html ng-app>
carrega o arquivo que define o controlador
<head>
<script src="../angular.js"></script>
<script src="message-controller.js"></script>
</head>
<body ng-controller="MessageController">
<div>
<textarea ng-model="descricao">{{descricao}}</textarea>
</div>
<p ng-show='naoTemQuantidadeMinimaDeCaractres()'>Minimo de 10
caracteres</p>
<div>
<button ngdisabled="naoTemQuantidadeMinimaDeCaractres()">Enviar</button>
</div>
</body>
</html>

Saturday, October 19, 13
EXEMPLO USANDO CONTROLLER
arquivo index2.html:
<!doctype html>
<html ng-app>
<head>
<script src="../angular.js"></script>
<script src="message-controller.js"></script>
</head>
<body ng-controller="MessageController">
<div>
<textarea ng-model="descricao">{{descricao}}</textarea>
</div>
<p ng-show='naoTemQuantidadeMinimaDeCaractres()'>Minimo de 10
caracteres</p>
<div>
<button ngdisabled="naoTemQuantidadeMinimaDeCaractres()">Enviar</button>
</div>
</body>
</html>

Saturday, October 19, 13
EXEMPLO USANDO CONTROLLER
arquivo index2.html:
<!doctype html>
<html ng-app>
<head>
<script src="../angular.js"></script>
<script src="message-controller.js"></script>
declara o uso do controlador
</head>
<body ng-controller="MessageController">
<div>
<textarea ng-model="descricao">{{descricao}}</textarea>
</div>
<p ng-show='naoTemQuantidadeMinimaDeCaractres()'>Minimo de 10
caracteres</p>
<div>
<button ngdisabled="naoTemQuantidadeMinimaDeCaractres()">Enviar</button>
</div>
</body>
</html>

Saturday, October 19, 13
EXEMPLO USANDO CONTROLLER
arquivo index2.html:
<!doctype html>
<html ng-app>
<head>
<script src="../angular.js"></script>
<script src="message-controller.js"></script>
</head>
<body ng-controller="MessageController">
<div>
<textarea ng-model="descricao">{{descricao}}</textarea>
</div>
<p ng-show='naoTemQuantidadeMinimaDeCaractres()'>Minimo de 10
caracteres</p>
<div>
<button ngdisabled="naoTemQuantidadeMinimaDeCaractres()">Enviar</button>
</div>
</body>
</html>

Saturday, October 19, 13
EXEMPLO USANDO CONTROLLER
arquivo index2.html:
<!doctype html>
<html ng-app>
<head>
<script src="../angular.js"></script>
<script src="message-controller.js"></script>
</head>
<body ng-controller="MessageController">
<div>
<textarea ng-model="descricao">{{descricao}}</textarea>
faz uso de uma funcao do $scope
</div>
<p ng-show='naoTemQuantidadeMinimaDeCaractres()'>Minimo de 10
caracteres</p>
<div>
faz uso de uma funcao do $scope
<button ngdisabled="naoTemQuantidadeMinimaDeCaractres()">Enviar</button>
</div>
</body>
</html>

Saturday, October 19, 13
EXEMPLO USANDO CONTROLLER
arquivo index2.html:
<!doctype html>
<html ng-app>
<head>
<script src="../angular.js"></script>
<script src="message-controller.js"></script>
</head>
<body ng-controller="MessageController">
<div>
<textarea ng-model="descricao">{{descricao}}</textarea>
</div>
<p ng-show='naoTemQuantidadeMinimaDeCaractres()'>Minimo de 10
caracteres</p>
<div>
<button ngdisabled="naoTemQuantidadeMinimaDeCaractres()">Enviar</button>
</div>
</body>
</html>

Saturday, October 19, 13
EXEMPLO USANDO CONTROLLER
arquivo message-controller.js:
function MessageController($scope){
$scope.descricao = "";

$scope.naoTemQuantidadeMinimaDeCaractres = function(){
return $scope.descricao.length < 10;
}
}

Saturday, October 19, 13
EXEMPLO USANDO CONTROLLER
arquivo message-controller.js:
function MessageController($scope){

incializa a variavel de escopo descricao

$scope.descricao = "";

$scope.naoTemQuantidadeMinimaDeCaractres = function(){
return $scope.descricao.length < 10;
}
}

Saturday, October 19, 13
EXEMPLO USANDO CONTROLLER
arquivo message-controller.js:
function MessageController($scope){
$scope.descricao = "";

$scope.naoTemQuantidadeMinimaDeCaractres = function(){
return $scope.descricao.length < 10;
}
}

Saturday, October 19, 13
EXEMPLO USANDO CONTROLLER
arquivo message-controller.js:
function MessageController($scope){
$scope.descricao = "";

inclui uma funcao no $scope para ser utilizada na UI
$scope.naoTemQuantidadeMinimaDeCaractres = function(){
return $scope.descricao.length < 10;
}
}

Saturday, October 19, 13
EXEMPLO USANDO CONTROLLER
arquivo message-controller.js:
function MessageController($scope){
$scope.descricao = "";

$scope.naoTemQuantidadeMinimaDeCaractres = function(){
return $scope.descricao.length < 10;
}
}

Saturday, October 19, 13
EXEMPLO USANDO CONTROLLER
arquivo message-controller.js:
declaracao do controlador recebendo $scope por parametro
function MessageController($scope){
$scope.descricao = "";

$scope.naoTemQuantidadeMinimaDeCaractres = function(){
return $scope.descricao.length < 10;
}
}

Saturday, October 19, 13
EXEMPLO USANDO CONTROLLER
arquivo message-controller.js:
function MessageController($scope){
$scope.descricao = "";

$scope.naoTemQuantidadeMinimaDeCaractres = function(){
return $scope.descricao.length < 10;
}
}

Saturday, October 19, 13
ESCOPOS ($SCOPE)

Saturday, October 19, 13
ESCOPOS ($SCOPE)
•

são objetos AngularJS usados para expor modelos (dados) e funções
para a view.

Saturday, October 19, 13
ESCOPOS ($SCOPE)
•

são objetos AngularJS usados para expor modelos (dados) e funções
para a view.

•

São conceitualmente parecidos com o ViewModel do padrão MVVM
(Model View ViewModel)

Saturday, October 19, 13
ESCOPOS ($SCOPE)
•

são objetos AngularJS usados para expor modelos (dados) e funções
para a view.

•

São conceitualmente parecidos com o ViewModel do padrão MVVM
(Model View ViewModel)

•

Novos escopos são criados sempre que o Angular encontra a diretiva ngcontroller

Saturday, October 19, 13
ESCOPOS ($SCOPE)
•

são objetos AngularJS usados para expor modelos (dados) e funções
para a view.

•

São conceitualmente parecidos com o ViewModel do padrão MVVM
(Model View ViewModel)

•

Novos escopos são criados sempre que o Angular encontra a diretiva ngcontroller

•

Todos os escopos possuem referencias para seus “pais”

Saturday, October 19, 13
ESCOPOS ($SCOPE)
•

são objetos AngularJS usados para expor modelos (dados) e funções
para a view.

•

São conceitualmente parecidos com o ViewModel do padrão MVVM
(Model View ViewModel)

•

Novos escopos são criados sempre que o Angular encontra a diretiva ngcontroller

•

Todos os escopos possuem referencias para seus “pais”

•

Ou seja eles são organizados em uma arvore de escopos

Saturday, October 19, 13
ESCOPOS ($SCOPE)
•

são objetos AngularJS usados para expor modelos (dados) e funções
para a view.

•

São conceitualmente parecidos com o ViewModel do padrão MVVM
(Model View ViewModel)

•

Novos escopos são criados sempre que o Angular encontra a diretiva ngcontroller

•

Todos os escopos possuem referencias para seus “pais”

•

Ou seja eles são organizados em uma arvore de escopos

•

Onde o nó raiz é o $rootScope

Saturday, October 19, 13
MODELOS

Saturday, October 19, 13
MODELOS
•

Modelos também sao objetos Javascript comuns.

Saturday, October 19, 13
MODELOS
•

Modelos também sao objetos Javascript comuns.

• Não

é necessario herdar de nenhum tipo especifico

Saturday, October 19, 13
MODELOS
•

Modelos também sao objetos Javascript comuns.

• Não

é necessario herdar de nenhum tipo especifico

• Na

pratica qualquer variavel associada ao escopo é um
modelo para o Angular

Saturday, October 19, 13
MODELOS
•

Modelos também sao objetos Javascript comuns.

• Não

é necessario herdar de nenhum tipo especifico

• Na

pratica qualquer variavel associada ao escopo é um
modelo para o Angular

•É

possivel utilizar como modelos, os seus objetos de dominio
Javascript já existentes. Basta associa-los ao $scope.

Saturday, October 19, 13
EXEMPLOS DE MODELOS
arquivo outro-controller.js:
function OutroController($scope){
$scope.descricao = ""; //modelo
$scope.usuario = { nome: “Joao”, idade: 20 }; //modelo
$scope.cidades = [“rio de janeiro”,”sao paulo”]; //modelo
$scope.produto = new Produto(); //modelo*
}

* considerando que exista a definição para o classe Produto.

Saturday, October 19, 13
EXEMPLO:
EXIBINDO UMA LISTAGEM DE
EMPREGADOS

Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo empresa-controller.js:
function EmpresaController($scope){
$scope.empregados = [
{nome: 'Zoraide', idade: 31},
{nome: 'Joao', idade: 20},
{nome: 'Maria', idade: 25},
{nome: 'Mario', idade: 30},
{nome: 'Flavia', idade: 22},
{nome: 'Percival', idade: 50},
{nome: 'Euclides', idade: 44},
{nome: 'Aristoteles', idade: 27}
];
}

Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo empresa-controller.js:
function EmpresaController($scope){
$scope.empregados = [
{nome: 'Zoraide', idade: 31},
{nome: 'Joao', idade: 20},
{nome: 'Maria', idade: 25},
{nome: 'Mario', idade: 30},
{nome: 'Flavia', idade: 22},
{nome: 'Percival', idade: 50},
{nome: 'Euclides', idade: 44},
{nome: 'Aristoteles', idade: 27}
];
}

Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo index.html:
...
<body>
<div ng-controller="EmpresaController">
<div>
<table>
<tr>
<th>Nome</th>
<th>Idade</th>
</tr>
<tr ng-repeat="empregado in empregados">
<td>{{empregado.nome}}</td>
<td>{{empregado.idade}}</td>
</tr>
</table>
</div>
</div>
...

Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo index.html:
...
<body>
<div ng-controller="EmpresaController">
<div>
<table>
<tr>
<th>Nome</th>
<th>Idade</th>
</tr>
<tr ng-repeat="empregado in empregados">
<td>{{empregado.nome}}</td>
<td>{{empregado.idade}}</td>
</tr>
</table>
</div>
</div>
...

Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo index.html:
...
<body>
<div ng-controller="EmpresaController">
<div>
<table>
<tr>
<th>Nome</th>
<th>Idade</th>
</tr>
<tr ng-repeat="empregado in empregados">
<td>{{empregado.nome}}</td>
<td>{{empregado.idade}}</td>
</tr>
</table>
</div>
</div>
...

Saturday, October 19, 13
EXIBINDO A LISTAGEM DE
EMPREGADOS.
PERMITINDO O CADASTRO
DE NOVOS EMPREGADOS

Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo empresa-controller2.js:
function EmpresaController($scope){
$scope.empregados = [
{nome: 'Zoraide', idade: 31},
{nome: 'Joao', idade: 20},
{nome: 'Maria', idade: 25},
{nome: 'Mario', idade: 30},
{nome: 'Flavia', idade: 22},
{nome: 'Percival', idade: 50},
{nome: 'Euclides', idade: 44},
{nome: 'Aristoteles', idade: 27}
];
$scope.adicionarEmpregado = function(){
var novo = {nome: $scope.nome, idade: $scope.idade};
$scope.empregados.push(novo);
};
}

Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo empresa-controller2.js:
function EmpresaController($scope){
$scope.empregados = [
{nome: 'Zoraide', idade: 31},
{nome: 'Joao', idade: 20},
{nome: 'Maria', idade: 25},
{nome: 'Mario', idade: 30},
{nome: 'Flavia', idade: 22},
{nome: 'Percival', idade: 50},
{nome: 'Euclides', idade: 44},
{nome: 'Aristoteles', idade: 27}
];
$scope.adicionarEmpregado = function(){
var novo = {nome: $scope.nome, idade: $scope.idade};
$scope.empregados.push(novo);
};
}

Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo index2.html:
<div ng-controller="EmpresaController">
<div>
<form>
<label>Nome</label><input ng-model='nome'/>
<label>Idade</label><input ng-model='idade'/>
<button ng-click="adicionarEmpregado()">Incluir</button>
</form>
</div>
<div>
<table>
<tr>
<th>Nome</th>
<th>Idade</th>
</tr>
<tr ng-repeat="empregado in empregados">
<td>{{empregado.nome}}</td>
<td>{{empregado.idade}}</td>
</tr>
</table>
</div>
</div>
Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo index2.html:
<div ng-controller="EmpresaController">
<div>
<form>
<label>Nome</label><input ng-model='nome'/>
<label>Idade</label><input ng-model='idade'/>
<button ng-click="adicionarEmpregado()">Incluir</button>
</form>
</div>
<div>
<table>
<tr>
<th>Nome</th>
<th>Idade</th>
</tr>
<tr ng-repeat="empregado in empregados">
<td>{{empregado.nome}}</td>
<td>{{empregado.idade}}</td>
</tr>
</table>
</div>
</div>
Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo index2.html:
<div ng-controller="EmpresaController">
<div>
<form>
<label>Nome</label><input ng-model='nome'/>
<label>Idade</label><input ng-model='idade'/>
<button ng-click="adicionarEmpregado()">Incluir</button>
</form>
</div>
<div>
<table>
<tr>
<th>Nome</th>
<th>Idade</th>
</tr>
<tr ng-repeat="empregado in empregados">
<td>{{empregado.nome}}</td>
<td>{{empregado.idade}}</td>
</tr>
</table>
</div>
</div>
Saturday, October 19, 13
MELHORANDO O CODIGO

Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo empresa-controller3.js:
function EmpresaController($scope){
$scope.novoEmpregado = new Empregado({});
$scope.empregados = obterListaDeEmpregados();

}

$scope.adicionarEmpregado = function(){
$scope.empregados.push($scope.novoEmpregado);
$scope.novoEmpregado = new Empregado({});
};

function obterListaDeEmpregados(){
var lista = [
new Empregado({nome: 'Zoraide', idade: 31}),
new Empregado({nome: 'Joao', idade: 20}),
new Empregado({nome: 'Maria', idade: 25}),
new Empregado({nome: 'Mario', idade: 30}),
new Empregado({nome: 'Flavia', idade: 22}),
new Empregado({nome: 'Percival', idade: 50}),
new Empregado({nome: 'Euclides', idade: 44}),
new Empregado({nome: 'Aristoteles', idade: 27})
];
return lista;
}
function Empregado(args){
this.nome = args.nome || undefined;
this.idade = args.idade || undefined;
}
Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo empresa-controller3.js:
function EmpresaController($scope){
$scope.novoEmpregado = new Empregado({});
$scope.empregados = obterListaDeEmpregados();

}

$scope.adicionarEmpregado = function(){
$scope.empregados.push($scope.novoEmpregado);
$scope.novoEmpregado = new Empregado({});
};

function obterListaDeEmpregados(){
var lista = [
new Empregado({nome: 'Zoraide', idade: 31}),
new Empregado({nome: 'Joao', idade: 20}),
new Empregado({nome: 'Maria', idade: 25}),
new Empregado({nome: 'Mario', idade: 30}),
new Empregado({nome: 'Flavia', idade: 22}),
new Empregado({nome: 'Percival', idade: 50}),
new Empregado({nome: 'Euclides', idade: 44}),
new Empregado({nome: 'Aristoteles', idade: 27})
];
return lista;
}
function Empregado(args){
this.nome = args.nome || undefined;
this.idade = args.idade || undefined;
}
Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo empresa-controller3.js:
function EmpresaController($scope){
$scope.novoEmpregado = new Empregado({});
$scope.empregados = obterListaDeEmpregados();

}

$scope.adicionarEmpregado = function(){
$scope.empregados.push($scope.novoEmpregado);
$scope.novoEmpregado = new Empregado({});
};

function obterListaDeEmpregados(){
var lista = [
new Empregado({nome: 'Zoraide', idade: 31}),
new Empregado({nome: 'Joao', idade: 20}),
new Empregado({nome: 'Maria', idade: 25}),
new Empregado({nome: 'Mario', idade: 30}),
new Empregado({nome: 'Flavia', idade: 22}),
new Empregado({nome: 'Percival', idade: 50}),
new Empregado({nome: 'Euclides', idade: 44}),
new Empregado({nome: 'Aristoteles', idade: 27})
];
return lista;
}
function Empregado(args){
this.nome = args.nome || undefined;
this.idade = args.idade || undefined;
}
Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo empresa-controller3.js:
function EmpresaController($scope){
$scope.novoEmpregado = new Empregado({});
$scope.empregados = obterListaDeEmpregados();

}

$scope.adicionarEmpregado = function(){
$scope.empregados.push($scope.novoEmpregado);
$scope.novoEmpregado = new Empregado({});
};

function obterListaDeEmpregados(){
var lista = [
new Empregado({nome: 'Zoraide', idade: 31}),
new Empregado({nome: 'Joao', idade: 20}),
new Empregado({nome: 'Maria', idade: 25}),
new Empregado({nome: 'Mario', idade: 30}),
new Empregado({nome: 'Flavia', idade: 22}),
new Empregado({nome: 'Percival', idade: 50}),
new Empregado({nome: 'Euclides', idade: 44}),
new Empregado({nome: 'Aristoteles', idade: 27})
];
return lista;
}
function Empregado(args){
this.nome = args.nome || undefined;
this.idade = args.idade || undefined;
}
Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo empresa-controller3.js:
function EmpresaController($scope){
$scope.novoEmpregado = new Empregado({});
$scope.empregados = obterListaDeEmpregados();

}

$scope.adicionarEmpregado = function(){
$scope.empregados.push($scope.novoEmpregado);
$scope.novoEmpregado = new Empregado({});
};

function obterListaDeEmpregados(){
var lista = [
new Empregado({nome: 'Zoraide', idade: 31}),
new Empregado({nome: 'Joao', idade: 20}),
new Empregado({nome: 'Maria', idade: 25}),
new Empregado({nome: 'Mario', idade: 30}),
new Empregado({nome: 'Flavia', idade: 22}),
new Empregado({nome: 'Percival', idade: 50}),
new Empregado({nome: 'Euclides', idade: 44}),
new Empregado({nome: 'Aristoteles', idade: 27})
];
return lista;
}
function Empregado(args){
this.nome = args.nome || undefined;
this.idade = args.idade || undefined;
}
Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo empresa-controller3.js:
function EmpresaController($scope){
$scope.novoEmpregado = new Empregado({});
$scope.empregados = obterListaDeEmpregados();

}

$scope.adicionarEmpregado = function(){
$scope.empregados.push($scope.novoEmpregado);
$scope.novoEmpregado = new Empregado({});
};

function obterListaDeEmpregados(){
var lista = [
new Empregado({nome: 'Zoraide', idade: 31}),
new Empregado({nome: 'Joao', idade: 20}),
new Empregado({nome: 'Maria', idade: 25}),
new Empregado({nome: 'Mario', idade: 30}),
new Empregado({nome: 'Flavia', idade: 22}),
new Empregado({nome: 'Percival', idade: 50}),
new Empregado({nome: 'Euclides', idade: 44}),
new Empregado({nome: 'Aristoteles', idade: 27})
];
return lista;
}
function Empregado(args){
this.nome = args.nome || undefined;
this.idade = args.idade || undefined;
}
Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo empresa-controller3.js:
function EmpresaController($scope){
$scope.novoEmpregado = new Empregado({});
$scope.empregados = obterListaDeEmpregados();

}

$scope.adicionarEmpregado = function(){
$scope.empregados.push($scope.novoEmpregado);
$scope.novoEmpregado = new Empregado({});
};

function obterListaDeEmpregados(){
var lista = [
new Empregado({nome: 'Zoraide', idade: 31}),
new Empregado({nome: 'Joao', idade: 20}),
new Empregado({nome: 'Maria', idade: 25}),
new Empregado({nome: 'Mario', idade: 30}),
new Empregado({nome: 'Flavia', idade: 22}),
new Empregado({nome: 'Percival', idade: 50}),
new Empregado({nome: 'Euclides', idade: 44}),
new Empregado({nome: 'Aristoteles', idade: 27})
];
return lista;
}
function Empregado(args){
this.nome = args.nome || undefined;
this.idade = args.idade || undefined;
}
Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo empresa-controller3.js:
function EmpresaController($scope){
$scope.novoEmpregado = new Empregado({});
$scope.empregados = obterListaDeEmpregados();

}

$scope.adicionarEmpregado = function(){
$scope.empregados.push($scope.novoEmpregado);
$scope.novoEmpregado = new Empregado({});
};

function obterListaDeEmpregados(){
var lista = [
new Empregado({nome: 'Zoraide', idade: 31}),
new Empregado({nome: 'Joao', idade: 20}),
new Empregado({nome: 'Maria', idade: 25}),
new Empregado({nome: 'Mario', idade: 30}),
new Empregado({nome: 'Flavia', idade: 22}),
new Empregado({nome: 'Percival', idade: 50}),
new Empregado({nome: 'Euclides', idade: 44}),
new Empregado({nome: 'Aristoteles', idade: 27})
];
return lista;
}
function Empregado(args){
this.nome = args.nome || undefined;
this.idade = args.idade || undefined;
}
Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo empresa-controller3.js:
function EmpresaController($scope){
$scope.novoEmpregado = new Empregado({});
$scope.empregados = obterListaDeEmpregados();

}

$scope.adicionarEmpregado = function(){
$scope.empregados.push($scope.novoEmpregado);
$scope.novoEmpregado = new Empregado({});
};

function obterListaDeEmpregados(){
var lista = [
new Empregado({nome: 'Zoraide', idade: 31}),
new Empregado({nome: 'Joao', idade: 20}),
new Empregado({nome: 'Maria', idade: 25}),
new Empregado({nome: 'Mario', idade: 30}),
new Empregado({nome: 'Flavia', idade: 22}),
new Empregado({nome: 'Percival', idade: 50}),
new Empregado({nome: 'Euclides', idade: 44}),
new Empregado({nome: 'Aristoteles', idade: 27})
];
return lista;
}
function Empregado(args){
this.nome = args.nome || undefined;
this.idade = args.idade || undefined;
}
Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo index3.html:
<div ng-controller="EmpresaController">
<div>
<form>
<label>Nome</label><input ng-model='novoEmpregado.nome'/>
<label>Idade</label><input ng-model='novoEmpregado.idade'/>
<button ng-click="adicionarEmpregado()">Incluir</button>
</form>
</div>
<div>
<table>
<tr>
<th>Nome</th>
<th>Idade</th>
</tr>
<tr ng-repeat="empregado in empregados">
<td>{{empregado.nome}}</td>
<td>{{empregado.idade}}</td>
</tr>
</table>
</div>
</div>
Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo index3.html:
<div ng-controller="EmpresaController">
<div>
<form>
<label>Nome</label><input ng-model='novoEmpregado.nome'/>
<label>Idade</label><input ng-model='novoEmpregado.idade'/>
<button ng-click="adicionarEmpregado()">Incluir</button>
</form>
</div>
<div>
<table>
<tr>
<th>Nome</th>
<th>Idade</th>
</tr>
<tr ng-repeat="empregado in empregados">
<td>{{empregado.nome}}</td>
<td>{{empregado.idade}}</td>
</tr>
</table>
</div>
</div>
Saturday, October 19, 13
FILTROS

Saturday, October 19, 13
FILTROS
• São

recursos do Angular para permitir a construção de
expressões mais complexas.

Saturday, October 19, 13
FILTROS
• São

recursos do Angular para permitir a construção de
expressões mais complexas.

• O Angular

Saturday, October 19, 13

ja vem “de fabrica” com alguns bons filtros.
FILTROS
• São

recursos do Angular para permitir a construção de
expressões mais complexas.

• O Angular
• São

ja vem “de fabrica” com alguns bons filtros.

dividios em 2 tipos:

• Formating

Filters

• currency, date, number, lowercase, uppercase
• Array Transforming

Saturday, October 19, 13

filters

e json
ORDENANDO A LISTA DE
EMPREGADOS

Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo filtro1.html:
<div ng-controller="EmpresaController">
<div>
<form>
<label>Nome</label><input ng-model='nome'/>
<label>Idade</label><input ng-model='idade'/>
<button ng-click="adicionarEmpregado()">Incluir</button>
</form>
</div>
<div>
<table>
<tr>
<th>Nome</th>
<th>Idade</th>
</tr>
<tr ng-repeat="empregado in empregados | orderBy:[nome]">
<td>{{empregado.nome}}</td>
<td>{{empregado.idade}}</td>
</tr>
</table>
</div>
</div>
Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo filtro1.html:
<div ng-controller="EmpresaController">
<div>
<form>
<label>Nome</label><input ng-model='nome'/>
<label>Idade</label><input ng-model='idade'/>
<button ng-click="adicionarEmpregado()">Incluir</button>
</form>
</div>
<div>
<table>
<tr>
<th>Nome</th>
<th>Idade</th>
</tr>
<tr ng-repeat="empregado in empregados | orderBy:[nome]">
<td>{{empregado.nome}}</td>
<td>{{empregado.idade}}</td>
</tr>
</table>
</div>
</div>
Saturday, October 19, 13
PESQUISANDO NA LISTA DE
EMPREGADOS

Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo filtro2.html:
<div ng-controller="EmpresaController">
...
<div>
<table>
<tr>
<th>Nome</th>
<th>Idade</th>
</tr>
<tr ng-repeat="empregado in empregados |filter:criteria |
orderBy:[nome]">
<td>{{empregado.nome}}</td>
<td>{{empregado.idade}}</td>
</tr>
</table>
</div>
<label> Pesquisar Por:
<input ng-model="criteria"/>
</div>

Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo filtro2.html:
<div ng-controller="EmpresaController">
...
<div>
<table>
<tr>
<th>Nome</th>
<th>Idade</th>
</tr>
<tr ng-repeat="empregado in empregados |filter:criteria |
orderBy:[nome]">
<td>{{empregado.nome}}</td>
<td>{{empregado.idade}}</td>
</tr>
</table>
</div>
<label> Pesquisar Por:
<input ng-model="criteria"/>
</div>

Saturday, October 19, 13
LISTA DE EMPREGADOS - 1
arquivo filtro2.html:
<div ng-controller="EmpresaController">
...
<div>
<table>
<tr>
<th>Nome</th>
<th>Idade</th>
</tr>
<tr ng-repeat="empregado in empregados |filter:criteria |
orderBy:[nome]">
<td>{{empregado.nome}}</td>
<td>{{empregado.idade}}</td>
</tr>
</table>
</div>
<label> Pesquisar Por:
<input ng-model="criteria"/>
</div>

Saturday, October 19, 13
OUTROS RECURSOS DO
ANGULAR
•

Services
•

•

$http, $timeout, $window, $route entre outros...

Custom Directives
•

Uma forma de extender o HTML, e criar seus proprios “componentes”

•

Modules

•

Factories

•

Dependency Injection

Saturday, October 19, 13
COMO FICA A COMUNICAÇÃO
COM O SERVER SIDE?
JSON

Saturday, October 19, 13

Java
Ruby
.Net
Node.js
Phyton
COMO FICA A COMUNICAÇÃO
COM O SERVER SIDE?
JSON

ttp e são
s $h rJS,
rviço ngula
s se do A
O
esta
izar
ce
esour para real o
$r
caçã
ões
opç
omuni
c
Saturday, October 19, 13

Java
Ruby
.Net
Node.js
Phyton
ANGULARJS
NÃO É BALA DE PRATA
Saturday, October 19, 13
CONSIDERAÇÕES

Saturday, October 19, 13
CONSIDERAÇÕES
Cada caso é um caso, avalie bem antes de decidir que
abordagem utilizar. Existem relatos positivos e negativos
quanto ao uso de frameworks MVC client-side

Saturday, October 19, 13
CONSIDERAÇÕES
Cada caso é um caso, avalie bem antes de decidir que
abordagem utilizar. Existem relatos positivos e negativos
quanto ao uso de frameworks MVC client-side
Client-Side MVC is not a silver bullet, é um post bem
famoso

Saturday, October 19, 13
CONSIDERAÇÕES
Cada caso é um caso, avalie bem antes de decidir que
abordagem utilizar. Existem relatos positivos e negativos
quanto ao uso de frameworks MVC client-side
Client-Side MVC is not a silver bullet, é um post bem
famoso
http://mir.aculo.us/2013/02/26/client-side-mvc-is-not-a-silver-bullet

Saturday, October 19, 13
Obrigado!
Sergio Azevedo
sergio.junior@caelum.com.br
@sergioazevedo
http://sagadoprogramador.com.br
Saturday, October 19, 13

Mais conteúdo relacionado

PDF
O Poderoso AngularJS
PPTX
Introdução ao AngularJS
PPTX
A evolução do AngularJS
PDF
Curso AngularJS - Parte 1
PDF
Material Design simples e rapido com AngularJS
PDF
Desenvolvimento Front end (AngularJS e Bootstrap)
PPTX
Introdução ao AngularJS!
PPTX
Desenvolvimento de Aplicações Web AngularJS no Contexto da IoT
O Poderoso AngularJS
Introdução ao AngularJS
A evolução do AngularJS
Curso AngularJS - Parte 1
Material Design simples e rapido com AngularJS
Desenvolvimento Front end (AngularJS e Bootstrap)
Introdução ao AngularJS!
Desenvolvimento de Aplicações Web AngularJS no Contexto da IoT

Mais procurados (20)

PPTX
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
PPTX
Apresentação AngularJS - Angular UI
PDF
Angular js
PDF
AngularJS - Just Digital
PDF
ANGULARJS: UM FRAMEWORK PARA FACILITAR SUA VIDA
PPTX
Domain-Driven Design
PPTX
Visão Geral sobre Angular JS
PDF
Curso AngularJS - Parte 2
PDF
Performance com AngularJS
PDF
O futuro dos WebApps com AngularJS 2.0
PPTX
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
PPTX
Vuejs Angularjs e Reactjs. Veja as diferenças de cada framework!
PDF
React - Biblioteca Javascript para criação de UI
PPTX
Apresentação angular js
PPTX
Construindo Diretivas com AngularJS
PDF
AngularJS com NODE.JS e Socket.IO
PDF
React - Introdução
ODP
Começando com Vue.js
PDF
Como Perder Peso (no browser)
PDF
Um futuro chamado Web Components
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
Apresentação AngularJS - Angular UI
Angular js
AngularJS - Just Digital
ANGULARJS: UM FRAMEWORK PARA FACILITAR SUA VIDA
Domain-Driven Design
Visão Geral sobre Angular JS
Curso AngularJS - Parte 2
Performance com AngularJS
O futuro dos WebApps com AngularJS 2.0
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Vuejs Angularjs e Reactjs. Veja as diferenças de cada framework!
React - Biblioteca Javascript para criação de UI
Apresentação angular js
Construindo Diretivas com AngularJS
AngularJS com NODE.JS e Socket.IO
React - Introdução
Começando com Vue.js
Como Perder Peso (no browser)
Um futuro chamado Web Components
Anúncio

Destaque (20)

PPTX
Criando aplicações Single-Page com AngularJS
PPTX
Utilizando diretivas com AngularJS
PDF
Desenvolvendo Bots com Inteligência Artificial para negócios em Ruby
ODP
Html5,css3,javascript o lugar onde sonhos se tornam realidade.
PPT
Front-end Development
PPTX
Mercado Front-End no Brasil e no mundo
PDF
Engenharia de front end de alta performance
PDF
Hugo Brioso | Website Design, Development & Internet Marketing | Graphic Desi...
PPTX
Minicurso Web. Front-end e HTML5 (parte 2)
PPT
SASS + COMPASS - Alta Produtividade no Front-end
PPTX
Minicurso Web. Front-end e HTML5 (parte 1)
PDF
SEO para Front-End
PDF
Os mitos do desenvolvimento front-end
PDF
O Papel do desenvolvedor Front End
PPT
Iniciando com jQuery
PPTX
Curso AngularJS - 2. conceptos básicos
PPTX
Curso AngularJS - 3. módulos y controladores
PPTX
Evoluindo a arquitetura de uma aplicação com AngularJS
PPTX
Curso AngularJS - 1. introducción
PPTX
Validando Formulários com AngularJS
Criando aplicações Single-Page com AngularJS
Utilizando diretivas com AngularJS
Desenvolvendo Bots com Inteligência Artificial para negócios em Ruby
Html5,css3,javascript o lugar onde sonhos se tornam realidade.
Front-end Development
Mercado Front-End no Brasil e no mundo
Engenharia de front end de alta performance
Hugo Brioso | Website Design, Development & Internet Marketing | Graphic Desi...
Minicurso Web. Front-end e HTML5 (parte 2)
SASS + COMPASS - Alta Produtividade no Front-end
Minicurso Web. Front-end e HTML5 (parte 1)
SEO para Front-End
Os mitos do desenvolvimento front-end
O Papel do desenvolvedor Front End
Iniciando com jQuery
Curso AngularJS - 2. conceptos básicos
Curso AngularJS - 3. módulos y controladores
Evoluindo a arquitetura de uma aplicação com AngularJS
Curso AngularJS - 1. introducción
Validando Formulários com AngularJS
Anúncio

Semelhante a AngularJS Abraçando o MVC Client-Side (20)

PDF
Neto Marin - Next Level Apps
PDF
Projetando Apps
PDF
Angular 4 Ionic 3 Cordova 5
PDF
Java script aula 10 - angularjs
PPTX
Angular 2, TypeScript e Além
PDF
Spring MVC Framework
PDF
Construindo sua primeira ontologia
PDF
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
PDF
Desenvolvimento de aplicações para o Google App Engine
PDF
Projetos reativos com Angular, RxJS e Redux (ngRx)
PPTX
Ionic Framework - Parte 1 - Iniciando um Projeto mais Robusto
PPTX
Desenvolvendo com Angular CLI
PDF
2° Codelab - Por onde começar com AngularJS
PDF
SEO para Front-End - BeagaJS
PDF
JAX-RS 2.0
PPTX
Workshop react + adonis.js
PDF
Aula 1 view model livedata e databinding.pptx
PDF
Django Módulo Básico Parte II
PDF
Aprendendo Angular com a CLI
PDF
AngularJS Components - Semana da Informática 2016
Neto Marin - Next Level Apps
Projetando Apps
Angular 4 Ionic 3 Cordova 5
Java script aula 10 - angularjs
Angular 2, TypeScript e Além
Spring MVC Framework
Construindo sua primeira ontologia
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de aplicações para o Google App Engine
Projetos reativos com Angular, RxJS e Redux (ngRx)
Ionic Framework - Parte 1 - Iniciando um Projeto mais Robusto
Desenvolvendo com Angular CLI
2° Codelab - Por onde começar com AngularJS
SEO para Front-End - BeagaJS
JAX-RS 2.0
Workshop react + adonis.js
Aula 1 view model livedata e databinding.pptx
Django Módulo Básico Parte II
Aprendendo Angular com a CLI
AngularJS Components - Semana da Informática 2016

Último (16)

PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PPTX
Arquitetura de computadores - Memórias Secundárias
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
Processos na gestão de transportes, TM100 Col18
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
COBITxITIL-Entenda as diferença em uso governança TI
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Arquitetura de computadores - Memórias Secundárias
Custos e liquidação no SAP Transportation Management, TM130 Col18
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Processos na gestão de transportes, TM100 Col18

AngularJS Abraçando o MVC Client-Side

  • 1. Abraçando o MVC Client Side Sergio Azevedo [email protected] @sergioazevedo http://sagadoprogramador.com.br Saturday, October 19, 13
  • 2. Arquitetura “padrão” de uma Aplicação Web Server Side Client Side h uest p req tt htt pr esp on Controlador View Template se html / json /xml Saturday, October 19, 13 Modelo View Renderizada
  • 3. Então qual o problema? Saturday, October 19, 13
  • 4. Qual o problema? JQuery resolve isso muito bem Saturday, October 19, 13
  • 5. “A necessidade de um framework MVC client-side, fica clara quando você começa a manipular em suas páginas, não só HTML mas também dados.” fonte: http://jster.net http://jster.net/blog/why-should-you-use-client-side-mvc-framework#.UmH4-ZTwIjE Saturday, October 19, 13
  • 6. E o framework MVC client-side que veremos hoje será: Saturday, October 19, 13
  • 8. VISÃO GERAL • Framework Saturday, October 19, 13 MVC Javascript, para aplicações web dinamicas
  • 9. VISÃO GERAL • Framework • Suporta Saturday, October 19, 13 MVC Javascript, para aplicações web dinamicas HTML 5
  • 10. VISÃO GERAL • Framework MVC Javascript, para aplicações web dinamicas • Suporta HTML 5 • Extende o HTML (Diretivas) Saturday, October 19, 13
  • 11. VISÃO GERAL • Framework MVC Javascript, para aplicações web dinamicas • Suporta HTML 5 • Extende o HTML (Diretivas) • Usa abordagem declarativa para expressar logica nas views Saturday, October 19, 13
  • 12. VISÃO GERAL • Framework MVC Javascript, para aplicações web dinamicas • Suporta HTML 5 • Extende o HTML (Diretivas) • Usa abordagem declarativa para expressar logica nas views • Injeção Saturday, October 19, 13 de dependencias (de graça)
  • 13. VISÃO GERAL • Framework MVC Javascript, para aplicações web dinamicas • Suporta HTML 5 • Extende o HTML (Diretivas) • Usa abordagem declarativa para expressar logica nas views • Injeção • Two de dependencias (de graça) way data binding Saturday, October 19, 13
  • 14. VISÃO GERAL • Framework MVC Javascript, para aplicações web dinamicas • Suporta HTML 5 • Extende o HTML (Diretivas) • Usa abordagem declarativa para expressar logica nas views • Injeção • Two de dependencias (de graça) way data binding • Mantido Saturday, October 19, 13 pela Google
  • 15. COMEÇANDO <!doctype html> <html ng-app> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/ 1.0.8/angular.min.js"></script> script> </head> <body> <div> <p>Digite seu nome: <input ng-model="nome" placeholder="Seu nome aqui..."></p> <p>{{nome}}</p> </div> </body> </html> Saturday, October 19, 13
  • 16. COMEÇANDO <!doctype html> <html ng-app> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/ 1.0.8/angular.min.js"></script> script> </head> <body> <div> <p>Digite seu nome: <input ng-model="nome" placeholder="Seu nome aqui..."></p> <p>{{nome}}</p> </div> </body> </html> carrega o angular Saturday, October 19, 13
  • 17. COMEÇANDO <!doctype html> <html ng-app> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/ 1.0.8/angular.min.js"></script> script> </head> <body> <div> <p>Digite seu nome: <input ng-model="nome" placeholder="Seu nome aqui..."></p> <p>{{nome}}</p> </div> </body> </html> Saturday, October 19, 13
  • 18. COMEÇANDO <!doctype html> <html ng-app> bootstrap do angular <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/ 1.0.8/angular.min.js"></script> script> </head> <body> <div> <p>Digite seu nome: <input ng-model="nome" placeholder="Seu nome aqui..."></p> <p>{{nome}}</p> </div> </body> </html> Saturday, October 19, 13
  • 19. COMEÇANDO <!doctype html> <html ng-app> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/ 1.0.8/angular.min.js"></script> script> </head> <body> <div> <p>Digite seu nome: <input ng-model="nome" placeholder="Seu nome aqui..."></p> <p>{{nome}}</p> </div> </body> </html> Saturday, October 19, 13
  • 20. COMEÇANDO <!doctype html> <html ng-app> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/ 1.0.8/angular.min.js"></script> script> </head> <body> cria a variavel de modelo nome <div> <p>Digite seu nome: <input ng-model="nome" placeholder="Seu nome aqui..."></p> <p>{{nome}}</p> </div> </body> </html> Saturday, October 19, 13
  • 21. COMEÇANDO <!doctype html> <html ng-app> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/ 1.0.8/angular.min.js"></script> script> </head> <body> <div> <p>Digite seu nome: <input ng-model="nome" placeholder="Seu nome aqui..."></p> <p>{{nome}}</p> </div> </body> </html> Saturday, October 19, 13
  • 22. COMEÇANDO <!doctype html> <html ng-app> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/ 1.0.8/angular.min.js"></script> script> </head> <body> <div> <p>Digite seu nome: <input ng-model="nome" placeholder="Seu nome aqui..."></p> <p>{{nome}}</p> exibe o conteudo da variavel nome </div> </body> </html> Saturday, October 19, 13
  • 23. COMEÇANDO <!doctype html> <html ng-app> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/ 1.0.8/angular.min.js"></script> script> </head> <body> <div> <p>Digite seu nome: <input ng-model="nome" placeholder="Seu nome aqui..."></p> <p>{{nome}}</p> </div> </body> </html> Saturday, October 19, 13
  • 24. WORK FLOW BASICO Saturday, October 19, 13
  • 25. WORK FLOW BASICO 1. O browser recebe o html e faz executa o DOM parser Saturday, October 19, 13
  • 26. WORK FLOW BASICO 1. O browser recebe o html e faz executa o DOM parser 2. O browser carrega o script do angular.js Saturday, October 19, 13
  • 27. WORK FLOW BASICO 1. O browser recebe o html e faz executa o DOM parser 2. O browser carrega o script do angular.js 3. Angular busca pela diretiva ng-app Saturday, October 19, 13
  • 28. WORK FLOW BASICO 1. O browser recebe o html e faz executa o DOM parser 2. O browser carrega o script do angular.js 3. Angular busca pela diretiva ng-app 4. O angular cria o serviço de compilação da pagina ($compile) e o escopo raiz ($rootScope) Saturday, October 19, 13
  • 29. WORK FLOW BASICO 1. O browser recebe o html e faz executa o DOM parser 2. O browser carrega o script do angular.js 3. Angular busca pela diretiva ng-app 4. O angular cria o serviço de compilação da pagina ($compile) e o escopo raiz ($rootScope) 5. Angular usa o $compile para compilar o DOM e liga-lo ao $rootScope. (HTML Compiler) Saturday, October 19, 13
  • 31. HTML COMPILER Compile: Percorre o DOM em busca de diretivas e entrega como resultado uma função de link Saturday, October 19, 13
  • 32. HTML COMPILER Compile: Percorre o DOM em busca de diretivas e entrega como resultado uma função de link Link: Combina as diretivas com o escopo ($scope) e gera assim a visão. Qualquer atleração em um modelo de um scope será refletida na visão, assim como qualquer interação do usuario com a visão será refletida no scope. Saturday, October 19, 13
  • 33. HTML COMPILER Compile: Percorre o DOM em busca de diretivas e entrega como resultado uma função de link Link: Combina as diretivas com o escopo ($scope) e gera assim a visão. Qualquer atleração em um modelo de um scope será refletida na visão, assim como qualquer interação do usuario com a visão será refletida no scope. “Two way data binding” Saturday, October 19, 13
  • 35. DIRETIVAS • São o jeito angular de criar páginas dinamicas. Saturday, October 19, 13
  • 36. DIRETIVAS • São o jeito angular de criar páginas dinamicas. • Angular usa uma abordagem declarativa para expressar o comportamento desejado dentro das views. Saturday, October 19, 13
  • 37. DIRETIVAS • São o jeito angular de criar páginas dinamicas. • Angular usa uma abordagem declarativa para expressar o comportamento desejado dentro das views. • Você deve focar em descrever o comportamento desejado. Saturday, October 19, 13
  • 39. ALGUMAS DIRETIVAS • ng-app - bootstrap do angular Saturday, October 19, 13
  • 40. ALGUMAS DIRETIVAS • ng-app - bootstrap do angular • ng-model - define/associa uma nova variavel no escopo corrente Saturday, October 19, 13
  • 41. ALGUMAS DIRETIVAS • ng-app - bootstrap do angular • ng-model - define/associa uma nova variavel no escopo corrente • ng-init - incializar uma variavel atribuindo um valor Saturday, October 19, 13
  • 42. ALGUMAS DIRETIVAS • ng-app - bootstrap do angular • ng-model - define/associa uma nova variavel no escopo corrente • ng-init - incializar uma variavel atribuindo um valor • ng-repeat - o foreach do Angular Saturday, October 19, 13
  • 43. ALGUMAS DIRETIVAS • ng-app - bootstrap do angular • ng-model - define/associa uma nova variavel no escopo corrente • ng-init - incializar uma variavel atribuindo um valor • ng-repeat - o foreach do Angular • ng-click - registra um evento de click Saturday, October 19, 13
  • 44. ALGUMAS DIRETIVAS • ng-app - bootstrap do angular • ng-model - define/associa uma nova variavel no escopo corrente • ng-init - incializar uma variavel atribuindo um valor • ng-repeat - o foreach do Angular • ng-click - registra um evento de click • ng-disable - recebe uma expressão que se avaliada positivamente desabilita o elemento. Saturday, October 19, 13
  • 45. ALGUMAS DIRETIVAS • ng-app - bootstrap do angular • ng-model - define/associa uma nova variavel no escopo corrente • ng-init - incializar uma variavel atribuindo um valor • ng-repeat - o foreach do Angular • ng-click - registra um evento de click • ng-disable - recebe uma expressão que se avaliada positivamente desabilita o elemento. • ng-controller - delcara a criacao de um novo escopo de controlador. Saturday, October 19, 13
  • 46. Exemplo: Exibir um text area e garantir que o botao enviar so funcione quando o usuario preencher no minimo 10 caracteres Saturday, October 19, 13
  • 47. EXEMPLO DIRETIVAS <!doctype html> <html ng-app> <head> <script src="../angular.js"></script> </head> <body> <div ng-init="descricao =''"> <textarea ng-model="descricao">{{descricao}}</textarea> </div> <p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p> <div> <button ng-disabled="descricao.length < 10">Enviar</button> </div> </body> </html> Saturday, October 19, 13
  • 48. EXEMPLO DIRETIVAS <!doctype html> <html ng-app> <head> <script src="../angular.js"></script> </head> cria a variavel de descricao atribuindo o valor vazio <body> <div ng-init="descricao =''"> <textarea ng-model="descricao">{{descricao}}</textarea> </div> <p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p> <div> <button ng-disabled="descricao.length < 10">Enviar</button> </div> </body> </html> Saturday, October 19, 13
  • 49. EXEMPLO DIRETIVAS <!doctype html> <html ng-app> <head> <script src="../angular.js"></script> </head> <body> <div ng-init="descricao =''"> <textarea ng-model="descricao">{{descricao}}</textarea> </div> <p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p> <div> <button ng-disabled="descricao.length < 10">Enviar</button> </div> </body> </html> Saturday, October 19, 13
  • 50. EXEMPLO DIRETIVAS <!doctype html> <html ng-app> <head> <script src="../angular.js"></script> </head> <body> <div ng-init="descricao =''"> <textarea ng-model="descricao">{{descricao}}</textarea> </div> Associa o variavel ao conteudo do text area <p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p> <div> <button ng-disabled="descricao.length < 10">Enviar</button> </div> </body> </html> Saturday, October 19, 13
  • 51. EXEMPLO DIRETIVAS <!doctype html> <html ng-app> <head> <script src="../angular.js"></script> </head> <body> <div ng-init="descricao =''"> <textarea ng-model="descricao">{{descricao}}</textarea> </div> <p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p> <div> <button ng-disabled="descricao.length < 10">Enviar</button> </div> </body> </html> Saturday, October 19, 13
  • 52. EXEMPLO DIRETIVAS <!doctype html> <html ng-app> <head> <script src="../angular.js"></script> </head> <body> <div ng-init="descricao =''"> <textarea ng-model="descricao">{{descricao}}</textarea> </div>declara que a mensagem só pode ser exibida enquanto o usuario nao digitar no minimo 10 caracteres <p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p> <div> <button ng-disabled="descricao.length < 10">Enviar</button> </div> </body> </html> Saturday, October 19, 13
  • 53. EXEMPLO DIRETIVAS <!doctype html> <html ng-app> <head> <script src="../angular.js"></script> </head> <body> <div ng-init="descricao =''"> <textarea ng-model="descricao">{{descricao}}</textarea> </div> <p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p> <div> <button ng-disabled="descricao.length < 10">Enviar</button> </div> </body> </html> Saturday, October 19, 13
  • 54. EXEMPLO DIRETIVAS <!doctype html> <html ng-app> <head> <script src="../angular.js"></script> </head> <body> <div ng-init="descricao =''"> <textarea ng-model="descricao">{{descricao}}</textarea> </div> <p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p> <div> <button ng-disabled="descricao.length < 10">Enviar</button> </div> declara que o botao so deve estar habilitado se o </body> </html> texo ultrapasar o minimo de 10 caracteres Saturday, October 19, 13
  • 55. EXEMPLO DIRETIVAS <!doctype html> <html ng-app> <head> <script src="../angular.js"></script> </head> <body> <div ng-init="descricao =''"> <textarea ng-model="descricao">{{descricao}}</textarea> </div> <p ng-show='descricao.length < 10'>Minimo de 10 caracteres</p> <div> <button ng-disabled="descricao.length < 10">Enviar</button> </div> </body> </html> Saturday, October 19, 13
  • 57. CONTROLADORES • São objetos Javascript convencionais Saturday, October 19, 13
  • 58. CONTROLADORES • São objetos Javascript convencionais • Nao precisam herdar de nenhuma classe Saturday, October 19, 13
  • 59. CONTROLADORES • São objetos Javascript convencionais • Nao • As precisam herdar de nenhuma classe responsabilidades de um controlador são: Saturday, October 19, 13
  • 60. CONTROLADORES • São objetos Javascript convencionais • Nao • As precisam herdar de nenhuma classe responsabilidades de um controlador são: • Incializar Saturday, October 19, 13 objetos do escopo ($scope). *(principal)
  • 61. CONTROLADORES • São objetos Javascript convencionais • Nao • As precisam herdar de nenhuma classe responsabilidades de um controlador são: • Incializar objetos do escopo ($scope). *(principal) • disponibilizar comportamento para UI através de funções ligadas ao $scope. Saturday, October 19, 13
  • 62. CONTROLADORES • São objetos Javascript convencionais o de o us itar • Nao precisam herdare ev ça s el ev de nenhumaaclasseo cê d init. Fa Vo mod nges de adores zaçõ controlador são: • As responsabilidadeslde um ntrol cia i e co ini tro d den • Incializar objetos do escopo ($scope). *(principal) • disponibilizar comportamento para UI através de funções ligadas ao $scope. Saturday, October 19, 13
  • 63. EXEMPLO USANDO CONTROLLER arquivo index2.html: <!doctype html> <html ng-app> <head> <script src="../angular.js"></script> <script src="message-controller.js"></script> </head> <body ng-controller="MessageController"> <div> <textarea ng-model="descricao">{{descricao}}</textarea> </div> <p ng-show='naoTemQuantidadeMinimaDeCaractres()'>Minimo de 10 caracteres</p> <div> <button ngdisabled="naoTemQuantidadeMinimaDeCaractres()">Enviar</button> </div> </body> </html> Saturday, October 19, 13
  • 64. EXEMPLO USANDO CONTROLLER arquivo index2.html: <!doctype html> <html ng-app> carrega o arquivo que define o controlador <head> <script src="../angular.js"></script> <script src="message-controller.js"></script> </head> <body ng-controller="MessageController"> <div> <textarea ng-model="descricao">{{descricao}}</textarea> </div> <p ng-show='naoTemQuantidadeMinimaDeCaractres()'>Minimo de 10 caracteres</p> <div> <button ngdisabled="naoTemQuantidadeMinimaDeCaractres()">Enviar</button> </div> </body> </html> Saturday, October 19, 13
  • 65. EXEMPLO USANDO CONTROLLER arquivo index2.html: <!doctype html> <html ng-app> <head> <script src="../angular.js"></script> <script src="message-controller.js"></script> </head> <body ng-controller="MessageController"> <div> <textarea ng-model="descricao">{{descricao}}</textarea> </div> <p ng-show='naoTemQuantidadeMinimaDeCaractres()'>Minimo de 10 caracteres</p> <div> <button ngdisabled="naoTemQuantidadeMinimaDeCaractres()">Enviar</button> </div> </body> </html> Saturday, October 19, 13
  • 66. EXEMPLO USANDO CONTROLLER arquivo index2.html: <!doctype html> <html ng-app> <head> <script src="../angular.js"></script> <script src="message-controller.js"></script> declara o uso do controlador </head> <body ng-controller="MessageController"> <div> <textarea ng-model="descricao">{{descricao}}</textarea> </div> <p ng-show='naoTemQuantidadeMinimaDeCaractres()'>Minimo de 10 caracteres</p> <div> <button ngdisabled="naoTemQuantidadeMinimaDeCaractres()">Enviar</button> </div> </body> </html> Saturday, October 19, 13
  • 67. EXEMPLO USANDO CONTROLLER arquivo index2.html: <!doctype html> <html ng-app> <head> <script src="../angular.js"></script> <script src="message-controller.js"></script> </head> <body ng-controller="MessageController"> <div> <textarea ng-model="descricao">{{descricao}}</textarea> </div> <p ng-show='naoTemQuantidadeMinimaDeCaractres()'>Minimo de 10 caracteres</p> <div> <button ngdisabled="naoTemQuantidadeMinimaDeCaractres()">Enviar</button> </div> </body> </html> Saturday, October 19, 13
  • 68. EXEMPLO USANDO CONTROLLER arquivo index2.html: <!doctype html> <html ng-app> <head> <script src="../angular.js"></script> <script src="message-controller.js"></script> </head> <body ng-controller="MessageController"> <div> <textarea ng-model="descricao">{{descricao}}</textarea> faz uso de uma funcao do $scope </div> <p ng-show='naoTemQuantidadeMinimaDeCaractres()'>Minimo de 10 caracteres</p> <div> faz uso de uma funcao do $scope <button ngdisabled="naoTemQuantidadeMinimaDeCaractres()">Enviar</button> </div> </body> </html> Saturday, October 19, 13
  • 69. EXEMPLO USANDO CONTROLLER arquivo index2.html: <!doctype html> <html ng-app> <head> <script src="../angular.js"></script> <script src="message-controller.js"></script> </head> <body ng-controller="MessageController"> <div> <textarea ng-model="descricao">{{descricao}}</textarea> </div> <p ng-show='naoTemQuantidadeMinimaDeCaractres()'>Minimo de 10 caracteres</p> <div> <button ngdisabled="naoTemQuantidadeMinimaDeCaractres()">Enviar</button> </div> </body> </html> Saturday, October 19, 13
  • 70. EXEMPLO USANDO CONTROLLER arquivo message-controller.js: function MessageController($scope){ $scope.descricao = ""; $scope.naoTemQuantidadeMinimaDeCaractres = function(){ return $scope.descricao.length < 10; } } Saturday, October 19, 13
  • 71. EXEMPLO USANDO CONTROLLER arquivo message-controller.js: function MessageController($scope){ incializa a variavel de escopo descricao $scope.descricao = ""; $scope.naoTemQuantidadeMinimaDeCaractres = function(){ return $scope.descricao.length < 10; } } Saturday, October 19, 13
  • 72. EXEMPLO USANDO CONTROLLER arquivo message-controller.js: function MessageController($scope){ $scope.descricao = ""; $scope.naoTemQuantidadeMinimaDeCaractres = function(){ return $scope.descricao.length < 10; } } Saturday, October 19, 13
  • 73. EXEMPLO USANDO CONTROLLER arquivo message-controller.js: function MessageController($scope){ $scope.descricao = ""; inclui uma funcao no $scope para ser utilizada na UI $scope.naoTemQuantidadeMinimaDeCaractres = function(){ return $scope.descricao.length < 10; } } Saturday, October 19, 13
  • 74. EXEMPLO USANDO CONTROLLER arquivo message-controller.js: function MessageController($scope){ $scope.descricao = ""; $scope.naoTemQuantidadeMinimaDeCaractres = function(){ return $scope.descricao.length < 10; } } Saturday, October 19, 13
  • 75. EXEMPLO USANDO CONTROLLER arquivo message-controller.js: declaracao do controlador recebendo $scope por parametro function MessageController($scope){ $scope.descricao = ""; $scope.naoTemQuantidadeMinimaDeCaractres = function(){ return $scope.descricao.length < 10; } } Saturday, October 19, 13
  • 76. EXEMPLO USANDO CONTROLLER arquivo message-controller.js: function MessageController($scope){ $scope.descricao = ""; $scope.naoTemQuantidadeMinimaDeCaractres = function(){ return $scope.descricao.length < 10; } } Saturday, October 19, 13
  • 78. ESCOPOS ($SCOPE) • são objetos AngularJS usados para expor modelos (dados) e funções para a view. Saturday, October 19, 13
  • 79. ESCOPOS ($SCOPE) • são objetos AngularJS usados para expor modelos (dados) e funções para a view. • São conceitualmente parecidos com o ViewModel do padrão MVVM (Model View ViewModel) Saturday, October 19, 13
  • 80. ESCOPOS ($SCOPE) • são objetos AngularJS usados para expor modelos (dados) e funções para a view. • São conceitualmente parecidos com o ViewModel do padrão MVVM (Model View ViewModel) • Novos escopos são criados sempre que o Angular encontra a diretiva ngcontroller Saturday, October 19, 13
  • 81. ESCOPOS ($SCOPE) • são objetos AngularJS usados para expor modelos (dados) e funções para a view. • São conceitualmente parecidos com o ViewModel do padrão MVVM (Model View ViewModel) • Novos escopos são criados sempre que o Angular encontra a diretiva ngcontroller • Todos os escopos possuem referencias para seus “pais” Saturday, October 19, 13
  • 82. ESCOPOS ($SCOPE) • são objetos AngularJS usados para expor modelos (dados) e funções para a view. • São conceitualmente parecidos com o ViewModel do padrão MVVM (Model View ViewModel) • Novos escopos são criados sempre que o Angular encontra a diretiva ngcontroller • Todos os escopos possuem referencias para seus “pais” • Ou seja eles são organizados em uma arvore de escopos Saturday, October 19, 13
  • 83. ESCOPOS ($SCOPE) • são objetos AngularJS usados para expor modelos (dados) e funções para a view. • São conceitualmente parecidos com o ViewModel do padrão MVVM (Model View ViewModel) • Novos escopos são criados sempre que o Angular encontra a diretiva ngcontroller • Todos os escopos possuem referencias para seus “pais” • Ou seja eles são organizados em uma arvore de escopos • Onde o nó raiz é o $rootScope Saturday, October 19, 13
  • 85. MODELOS • Modelos também sao objetos Javascript comuns. Saturday, October 19, 13
  • 86. MODELOS • Modelos também sao objetos Javascript comuns. • Não é necessario herdar de nenhum tipo especifico Saturday, October 19, 13
  • 87. MODELOS • Modelos também sao objetos Javascript comuns. • Não é necessario herdar de nenhum tipo especifico • Na pratica qualquer variavel associada ao escopo é um modelo para o Angular Saturday, October 19, 13
  • 88. MODELOS • Modelos também sao objetos Javascript comuns. • Não é necessario herdar de nenhum tipo especifico • Na pratica qualquer variavel associada ao escopo é um modelo para o Angular •É possivel utilizar como modelos, os seus objetos de dominio Javascript já existentes. Basta associa-los ao $scope. Saturday, October 19, 13
  • 89. EXEMPLOS DE MODELOS arquivo outro-controller.js: function OutroController($scope){ $scope.descricao = ""; //modelo $scope.usuario = { nome: “Joao”, idade: 20 }; //modelo $scope.cidades = [“rio de janeiro”,”sao paulo”]; //modelo $scope.produto = new Produto(); //modelo* } * considerando que exista a definição para o classe Produto. Saturday, October 19, 13
  • 90. EXEMPLO: EXIBINDO UMA LISTAGEM DE EMPREGADOS Saturday, October 19, 13
  • 91. LISTA DE EMPREGADOS - 1 arquivo empresa-controller.js: function EmpresaController($scope){ $scope.empregados = [ {nome: 'Zoraide', idade: 31}, {nome: 'Joao', idade: 20}, {nome: 'Maria', idade: 25}, {nome: 'Mario', idade: 30}, {nome: 'Flavia', idade: 22}, {nome: 'Percival', idade: 50}, {nome: 'Euclides', idade: 44}, {nome: 'Aristoteles', idade: 27} ]; } Saturday, October 19, 13
  • 92. LISTA DE EMPREGADOS - 1 arquivo empresa-controller.js: function EmpresaController($scope){ $scope.empregados = [ {nome: 'Zoraide', idade: 31}, {nome: 'Joao', idade: 20}, {nome: 'Maria', idade: 25}, {nome: 'Mario', idade: 30}, {nome: 'Flavia', idade: 22}, {nome: 'Percival', idade: 50}, {nome: 'Euclides', idade: 44}, {nome: 'Aristoteles', idade: 27} ]; } Saturday, October 19, 13
  • 93. LISTA DE EMPREGADOS - 1 arquivo index.html: ... <body> <div ng-controller="EmpresaController"> <div> <table> <tr> <th>Nome</th> <th>Idade</th> </tr> <tr ng-repeat="empregado in empregados"> <td>{{empregado.nome}}</td> <td>{{empregado.idade}}</td> </tr> </table> </div> </div> ... Saturday, October 19, 13
  • 94. LISTA DE EMPREGADOS - 1 arquivo index.html: ... <body> <div ng-controller="EmpresaController"> <div> <table> <tr> <th>Nome</th> <th>Idade</th> </tr> <tr ng-repeat="empregado in empregados"> <td>{{empregado.nome}}</td> <td>{{empregado.idade}}</td> </tr> </table> </div> </div> ... Saturday, October 19, 13
  • 95. LISTA DE EMPREGADOS - 1 arquivo index.html: ... <body> <div ng-controller="EmpresaController"> <div> <table> <tr> <th>Nome</th> <th>Idade</th> </tr> <tr ng-repeat="empregado in empregados"> <td>{{empregado.nome}}</td> <td>{{empregado.idade}}</td> </tr> </table> </div> </div> ... Saturday, October 19, 13
  • 96. EXIBINDO A LISTAGEM DE EMPREGADOS. PERMITINDO O CADASTRO DE NOVOS EMPREGADOS Saturday, October 19, 13
  • 97. LISTA DE EMPREGADOS - 1 arquivo empresa-controller2.js: function EmpresaController($scope){ $scope.empregados = [ {nome: 'Zoraide', idade: 31}, {nome: 'Joao', idade: 20}, {nome: 'Maria', idade: 25}, {nome: 'Mario', idade: 30}, {nome: 'Flavia', idade: 22}, {nome: 'Percival', idade: 50}, {nome: 'Euclides', idade: 44}, {nome: 'Aristoteles', idade: 27} ]; $scope.adicionarEmpregado = function(){ var novo = {nome: $scope.nome, idade: $scope.idade}; $scope.empregados.push(novo); }; } Saturday, October 19, 13
  • 98. LISTA DE EMPREGADOS - 1 arquivo empresa-controller2.js: function EmpresaController($scope){ $scope.empregados = [ {nome: 'Zoraide', idade: 31}, {nome: 'Joao', idade: 20}, {nome: 'Maria', idade: 25}, {nome: 'Mario', idade: 30}, {nome: 'Flavia', idade: 22}, {nome: 'Percival', idade: 50}, {nome: 'Euclides', idade: 44}, {nome: 'Aristoteles', idade: 27} ]; $scope.adicionarEmpregado = function(){ var novo = {nome: $scope.nome, idade: $scope.idade}; $scope.empregados.push(novo); }; } Saturday, October 19, 13
  • 99. LISTA DE EMPREGADOS - 1 arquivo index2.html: <div ng-controller="EmpresaController"> <div> <form> <label>Nome</label><input ng-model='nome'/> <label>Idade</label><input ng-model='idade'/> <button ng-click="adicionarEmpregado()">Incluir</button> </form> </div> <div> <table> <tr> <th>Nome</th> <th>Idade</th> </tr> <tr ng-repeat="empregado in empregados"> <td>{{empregado.nome}}</td> <td>{{empregado.idade}}</td> </tr> </table> </div> </div> Saturday, October 19, 13
  • 100. LISTA DE EMPREGADOS - 1 arquivo index2.html: <div ng-controller="EmpresaController"> <div> <form> <label>Nome</label><input ng-model='nome'/> <label>Idade</label><input ng-model='idade'/> <button ng-click="adicionarEmpregado()">Incluir</button> </form> </div> <div> <table> <tr> <th>Nome</th> <th>Idade</th> </tr> <tr ng-repeat="empregado in empregados"> <td>{{empregado.nome}}</td> <td>{{empregado.idade}}</td> </tr> </table> </div> </div> Saturday, October 19, 13
  • 101. LISTA DE EMPREGADOS - 1 arquivo index2.html: <div ng-controller="EmpresaController"> <div> <form> <label>Nome</label><input ng-model='nome'/> <label>Idade</label><input ng-model='idade'/> <button ng-click="adicionarEmpregado()">Incluir</button> </form> </div> <div> <table> <tr> <th>Nome</th> <th>Idade</th> </tr> <tr ng-repeat="empregado in empregados"> <td>{{empregado.nome}}</td> <td>{{empregado.idade}}</td> </tr> </table> </div> </div> Saturday, October 19, 13
  • 102. MELHORANDO O CODIGO Saturday, October 19, 13
  • 103. LISTA DE EMPREGADOS - 1 arquivo empresa-controller3.js: function EmpresaController($scope){ $scope.novoEmpregado = new Empregado({}); $scope.empregados = obterListaDeEmpregados(); } $scope.adicionarEmpregado = function(){ $scope.empregados.push($scope.novoEmpregado); $scope.novoEmpregado = new Empregado({}); }; function obterListaDeEmpregados(){ var lista = [ new Empregado({nome: 'Zoraide', idade: 31}), new Empregado({nome: 'Joao', idade: 20}), new Empregado({nome: 'Maria', idade: 25}), new Empregado({nome: 'Mario', idade: 30}), new Empregado({nome: 'Flavia', idade: 22}), new Empregado({nome: 'Percival', idade: 50}), new Empregado({nome: 'Euclides', idade: 44}), new Empregado({nome: 'Aristoteles', idade: 27}) ]; return lista; } function Empregado(args){ this.nome = args.nome || undefined; this.idade = args.idade || undefined; } Saturday, October 19, 13
  • 104. LISTA DE EMPREGADOS - 1 arquivo empresa-controller3.js: function EmpresaController($scope){ $scope.novoEmpregado = new Empregado({}); $scope.empregados = obterListaDeEmpregados(); } $scope.adicionarEmpregado = function(){ $scope.empregados.push($scope.novoEmpregado); $scope.novoEmpregado = new Empregado({}); }; function obterListaDeEmpregados(){ var lista = [ new Empregado({nome: 'Zoraide', idade: 31}), new Empregado({nome: 'Joao', idade: 20}), new Empregado({nome: 'Maria', idade: 25}), new Empregado({nome: 'Mario', idade: 30}), new Empregado({nome: 'Flavia', idade: 22}), new Empregado({nome: 'Percival', idade: 50}), new Empregado({nome: 'Euclides', idade: 44}), new Empregado({nome: 'Aristoteles', idade: 27}) ]; return lista; } function Empregado(args){ this.nome = args.nome || undefined; this.idade = args.idade || undefined; } Saturday, October 19, 13
  • 105. LISTA DE EMPREGADOS - 1 arquivo empresa-controller3.js: function EmpresaController($scope){ $scope.novoEmpregado = new Empregado({}); $scope.empregados = obterListaDeEmpregados(); } $scope.adicionarEmpregado = function(){ $scope.empregados.push($scope.novoEmpregado); $scope.novoEmpregado = new Empregado({}); }; function obterListaDeEmpregados(){ var lista = [ new Empregado({nome: 'Zoraide', idade: 31}), new Empregado({nome: 'Joao', idade: 20}), new Empregado({nome: 'Maria', idade: 25}), new Empregado({nome: 'Mario', idade: 30}), new Empregado({nome: 'Flavia', idade: 22}), new Empregado({nome: 'Percival', idade: 50}), new Empregado({nome: 'Euclides', idade: 44}), new Empregado({nome: 'Aristoteles', idade: 27}) ]; return lista; } function Empregado(args){ this.nome = args.nome || undefined; this.idade = args.idade || undefined; } Saturday, October 19, 13
  • 106. LISTA DE EMPREGADOS - 1 arquivo empresa-controller3.js: function EmpresaController($scope){ $scope.novoEmpregado = new Empregado({}); $scope.empregados = obterListaDeEmpregados(); } $scope.adicionarEmpregado = function(){ $scope.empregados.push($scope.novoEmpregado); $scope.novoEmpregado = new Empregado({}); }; function obterListaDeEmpregados(){ var lista = [ new Empregado({nome: 'Zoraide', idade: 31}), new Empregado({nome: 'Joao', idade: 20}), new Empregado({nome: 'Maria', idade: 25}), new Empregado({nome: 'Mario', idade: 30}), new Empregado({nome: 'Flavia', idade: 22}), new Empregado({nome: 'Percival', idade: 50}), new Empregado({nome: 'Euclides', idade: 44}), new Empregado({nome: 'Aristoteles', idade: 27}) ]; return lista; } function Empregado(args){ this.nome = args.nome || undefined; this.idade = args.idade || undefined; } Saturday, October 19, 13
  • 107. LISTA DE EMPREGADOS - 1 arquivo empresa-controller3.js: function EmpresaController($scope){ $scope.novoEmpregado = new Empregado({}); $scope.empregados = obterListaDeEmpregados(); } $scope.adicionarEmpregado = function(){ $scope.empregados.push($scope.novoEmpregado); $scope.novoEmpregado = new Empregado({}); }; function obterListaDeEmpregados(){ var lista = [ new Empregado({nome: 'Zoraide', idade: 31}), new Empregado({nome: 'Joao', idade: 20}), new Empregado({nome: 'Maria', idade: 25}), new Empregado({nome: 'Mario', idade: 30}), new Empregado({nome: 'Flavia', idade: 22}), new Empregado({nome: 'Percival', idade: 50}), new Empregado({nome: 'Euclides', idade: 44}), new Empregado({nome: 'Aristoteles', idade: 27}) ]; return lista; } function Empregado(args){ this.nome = args.nome || undefined; this.idade = args.idade || undefined; } Saturday, October 19, 13
  • 108. LISTA DE EMPREGADOS - 1 arquivo empresa-controller3.js: function EmpresaController($scope){ $scope.novoEmpregado = new Empregado({}); $scope.empregados = obterListaDeEmpregados(); } $scope.adicionarEmpregado = function(){ $scope.empregados.push($scope.novoEmpregado); $scope.novoEmpregado = new Empregado({}); }; function obterListaDeEmpregados(){ var lista = [ new Empregado({nome: 'Zoraide', idade: 31}), new Empregado({nome: 'Joao', idade: 20}), new Empregado({nome: 'Maria', idade: 25}), new Empregado({nome: 'Mario', idade: 30}), new Empregado({nome: 'Flavia', idade: 22}), new Empregado({nome: 'Percival', idade: 50}), new Empregado({nome: 'Euclides', idade: 44}), new Empregado({nome: 'Aristoteles', idade: 27}) ]; return lista; } function Empregado(args){ this.nome = args.nome || undefined; this.idade = args.idade || undefined; } Saturday, October 19, 13
  • 109. LISTA DE EMPREGADOS - 1 arquivo empresa-controller3.js: function EmpresaController($scope){ $scope.novoEmpregado = new Empregado({}); $scope.empregados = obterListaDeEmpregados(); } $scope.adicionarEmpregado = function(){ $scope.empregados.push($scope.novoEmpregado); $scope.novoEmpregado = new Empregado({}); }; function obterListaDeEmpregados(){ var lista = [ new Empregado({nome: 'Zoraide', idade: 31}), new Empregado({nome: 'Joao', idade: 20}), new Empregado({nome: 'Maria', idade: 25}), new Empregado({nome: 'Mario', idade: 30}), new Empregado({nome: 'Flavia', idade: 22}), new Empregado({nome: 'Percival', idade: 50}), new Empregado({nome: 'Euclides', idade: 44}), new Empregado({nome: 'Aristoteles', idade: 27}) ]; return lista; } function Empregado(args){ this.nome = args.nome || undefined; this.idade = args.idade || undefined; } Saturday, October 19, 13
  • 110. LISTA DE EMPREGADOS - 1 arquivo empresa-controller3.js: function EmpresaController($scope){ $scope.novoEmpregado = new Empregado({}); $scope.empregados = obterListaDeEmpregados(); } $scope.adicionarEmpregado = function(){ $scope.empregados.push($scope.novoEmpregado); $scope.novoEmpregado = new Empregado({}); }; function obterListaDeEmpregados(){ var lista = [ new Empregado({nome: 'Zoraide', idade: 31}), new Empregado({nome: 'Joao', idade: 20}), new Empregado({nome: 'Maria', idade: 25}), new Empregado({nome: 'Mario', idade: 30}), new Empregado({nome: 'Flavia', idade: 22}), new Empregado({nome: 'Percival', idade: 50}), new Empregado({nome: 'Euclides', idade: 44}), new Empregado({nome: 'Aristoteles', idade: 27}) ]; return lista; } function Empregado(args){ this.nome = args.nome || undefined; this.idade = args.idade || undefined; } Saturday, October 19, 13
  • 111. LISTA DE EMPREGADOS - 1 arquivo empresa-controller3.js: function EmpresaController($scope){ $scope.novoEmpregado = new Empregado({}); $scope.empregados = obterListaDeEmpregados(); } $scope.adicionarEmpregado = function(){ $scope.empregados.push($scope.novoEmpregado); $scope.novoEmpregado = new Empregado({}); }; function obterListaDeEmpregados(){ var lista = [ new Empregado({nome: 'Zoraide', idade: 31}), new Empregado({nome: 'Joao', idade: 20}), new Empregado({nome: 'Maria', idade: 25}), new Empregado({nome: 'Mario', idade: 30}), new Empregado({nome: 'Flavia', idade: 22}), new Empregado({nome: 'Percival', idade: 50}), new Empregado({nome: 'Euclides', idade: 44}), new Empregado({nome: 'Aristoteles', idade: 27}) ]; return lista; } function Empregado(args){ this.nome = args.nome || undefined; this.idade = args.idade || undefined; } Saturday, October 19, 13
  • 112. LISTA DE EMPREGADOS - 1 arquivo index3.html: <div ng-controller="EmpresaController"> <div> <form> <label>Nome</label><input ng-model='novoEmpregado.nome'/> <label>Idade</label><input ng-model='novoEmpregado.idade'/> <button ng-click="adicionarEmpregado()">Incluir</button> </form> </div> <div> <table> <tr> <th>Nome</th> <th>Idade</th> </tr> <tr ng-repeat="empregado in empregados"> <td>{{empregado.nome}}</td> <td>{{empregado.idade}}</td> </tr> </table> </div> </div> Saturday, October 19, 13
  • 113. LISTA DE EMPREGADOS - 1 arquivo index3.html: <div ng-controller="EmpresaController"> <div> <form> <label>Nome</label><input ng-model='novoEmpregado.nome'/> <label>Idade</label><input ng-model='novoEmpregado.idade'/> <button ng-click="adicionarEmpregado()">Incluir</button> </form> </div> <div> <table> <tr> <th>Nome</th> <th>Idade</th> </tr> <tr ng-repeat="empregado in empregados"> <td>{{empregado.nome}}</td> <td>{{empregado.idade}}</td> </tr> </table> </div> </div> Saturday, October 19, 13
  • 115. FILTROS • São recursos do Angular para permitir a construção de expressões mais complexas. Saturday, October 19, 13
  • 116. FILTROS • São recursos do Angular para permitir a construção de expressões mais complexas. • O Angular Saturday, October 19, 13 ja vem “de fabrica” com alguns bons filtros.
  • 117. FILTROS • São recursos do Angular para permitir a construção de expressões mais complexas. • O Angular • São ja vem “de fabrica” com alguns bons filtros. dividios em 2 tipos: • Formating Filters • currency, date, number, lowercase, uppercase • Array Transforming Saturday, October 19, 13 filters e json
  • 118. ORDENANDO A LISTA DE EMPREGADOS Saturday, October 19, 13
  • 119. LISTA DE EMPREGADOS - 1 arquivo filtro1.html: <div ng-controller="EmpresaController"> <div> <form> <label>Nome</label><input ng-model='nome'/> <label>Idade</label><input ng-model='idade'/> <button ng-click="adicionarEmpregado()">Incluir</button> </form> </div> <div> <table> <tr> <th>Nome</th> <th>Idade</th> </tr> <tr ng-repeat="empregado in empregados | orderBy:[nome]"> <td>{{empregado.nome}}</td> <td>{{empregado.idade}}</td> </tr> </table> </div> </div> Saturday, October 19, 13
  • 120. LISTA DE EMPREGADOS - 1 arquivo filtro1.html: <div ng-controller="EmpresaController"> <div> <form> <label>Nome</label><input ng-model='nome'/> <label>Idade</label><input ng-model='idade'/> <button ng-click="adicionarEmpregado()">Incluir</button> </form> </div> <div> <table> <tr> <th>Nome</th> <th>Idade</th> </tr> <tr ng-repeat="empregado in empregados | orderBy:[nome]"> <td>{{empregado.nome}}</td> <td>{{empregado.idade}}</td> </tr> </table> </div> </div> Saturday, October 19, 13
  • 121. PESQUISANDO NA LISTA DE EMPREGADOS Saturday, October 19, 13
  • 122. LISTA DE EMPREGADOS - 1 arquivo filtro2.html: <div ng-controller="EmpresaController"> ... <div> <table> <tr> <th>Nome</th> <th>Idade</th> </tr> <tr ng-repeat="empregado in empregados |filter:criteria | orderBy:[nome]"> <td>{{empregado.nome}}</td> <td>{{empregado.idade}}</td> </tr> </table> </div> <label> Pesquisar Por: <input ng-model="criteria"/> </div> Saturday, October 19, 13
  • 123. LISTA DE EMPREGADOS - 1 arquivo filtro2.html: <div ng-controller="EmpresaController"> ... <div> <table> <tr> <th>Nome</th> <th>Idade</th> </tr> <tr ng-repeat="empregado in empregados |filter:criteria | orderBy:[nome]"> <td>{{empregado.nome}}</td> <td>{{empregado.idade}}</td> </tr> </table> </div> <label> Pesquisar Por: <input ng-model="criteria"/> </div> Saturday, October 19, 13
  • 124. LISTA DE EMPREGADOS - 1 arquivo filtro2.html: <div ng-controller="EmpresaController"> ... <div> <table> <tr> <th>Nome</th> <th>Idade</th> </tr> <tr ng-repeat="empregado in empregados |filter:criteria | orderBy:[nome]"> <td>{{empregado.nome}}</td> <td>{{empregado.idade}}</td> </tr> </table> </div> <label> Pesquisar Por: <input ng-model="criteria"/> </div> Saturday, October 19, 13
  • 125. OUTROS RECURSOS DO ANGULAR • Services • • $http, $timeout, $window, $route entre outros... Custom Directives • Uma forma de extender o HTML, e criar seus proprios “componentes” • Modules • Factories • Dependency Injection Saturday, October 19, 13
  • 126. COMO FICA A COMUNICAÇÃO COM O SERVER SIDE? JSON Saturday, October 19, 13 Java Ruby .Net Node.js Phyton
  • 127. COMO FICA A COMUNICAÇÃO COM O SERVER SIDE? JSON ttp e são s $h rJS, rviço ngula s se do A O esta izar ce esour para real o $r caçã ões opç omuni c Saturday, October 19, 13 Java Ruby .Net Node.js Phyton
  • 128. ANGULARJS NÃO É BALA DE PRATA Saturday, October 19, 13
  • 130. CONSIDERAÇÕES Cada caso é um caso, avalie bem antes de decidir que abordagem utilizar. Existem relatos positivos e negativos quanto ao uso de frameworks MVC client-side Saturday, October 19, 13
  • 131. CONSIDERAÇÕES Cada caso é um caso, avalie bem antes de decidir que abordagem utilizar. Existem relatos positivos e negativos quanto ao uso de frameworks MVC client-side Client-Side MVC is not a silver bullet, é um post bem famoso Saturday, October 19, 13
  • 132. CONSIDERAÇÕES Cada caso é um caso, avalie bem antes de decidir que abordagem utilizar. Existem relatos positivos e negativos quanto ao uso de frameworks MVC client-side Client-Side MVC is not a silver bullet, é um post bem famoso http://mir.aculo.us/2013/02/26/client-side-mvc-is-not-a-silver-bullet Saturday, October 19, 13