Eduardo Mendes de Oliveira
edumendes@gmail.com
Eduardo Mendes (edumendes@gmail.com)
Introdução
2
Eduardo Mendes (edumendes@gmail.com)
AngularJS
3
Ajuda a organizar o JS
Boa escolha para sites dinâmicos
Se comunica com jQuery
Possibilita a criação de sites interativos
Fácil de testar
Framework JS
para o lado do cliente
capaz de adicionar
interatividade ao HTML
Eduardo Mendes (edumendes@gmail.com)
Arquitetura MVC
4
Eduardo Mendes (edumendes@gmail.com)5
Cross-Browser
JavaScript
Eduardo Mendes (edumendes@gmail.com)
Diretivas
Módulos
Controles
Expressões
6
Anotações HTML que disparam
comportamentos JS
Onde estão localizados os componentes
Onde se adicionar comportamento à
aplicação
A forma de exibir os valores nas páginas
Eduardo Mendes (edumendes@gmail.com)
Diretivas
7
Eduardo Mendes (edumendes@gmail.com)8
Directives
Uma Directive é um marcador em um tag HTML, como um atributo, que faz a ponte

entre o HTML e um código JS
<!DOCTYPE html>
<html>
<body>
...
</body>
</html>
function HelloAngular() {
alert("Hello from Angular, World");
}
Eduardo Mendes (edumendes@gmail.com)9
Directives
<!DOCTYPE html>
<html>
<body >
...
</body>
</html>
function HelloAngular() {
alert("Hello from Angular, World");
}ng-controller="HelloAngular"
Eduardo Mendes (edumendes@gmail.com)
Utilizando AngularJS
10
Eduardo Mendes (edumendes@gmail.com)11
Utilizando AngularJS
download AngularJS
carregue-o em seu documento HTML
<script src=“angular.min.js”></script>
carregue seus componentes angularjs
1
2
3
utilizaremos também Bootstrap
<link href=“bootstrap.min.css” ... />
4
<script src=“app.js”></script>
Eduardo Mendes (edumendes@gmail.com)12
Iniciando com AngularJS
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="css/bootstrap.min.css">
</head>
<body>
<script src=“js/angular.min.js"></script>
<script src=“js/app.js”></script>
</body>
</html>
Eduardo Mendes (edumendes@gmail.com)
Módulos
13
Eduardo Mendes (edumendes@gmail.com)14
Módulos
Onde são escritos partes de uma aplicação AngularJS
Tornam o código mais fácil de manter e de entender
Também serve para comunicar as dependências da aplicação
Módulo podem depender de outros módulos
Eduardo Mendes (edumendes@gmail.com)15
Criando o primeiro Módulo
var app = angular.module('livraria', [ ]);
AngularJS Nome da
Aplicação
Dependências
Eduardo Mendes (edumendes@gmail.com)16
Criando o primeiro Módulo
var app = angular.module('livraria', [ ]); app.js
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="css/bootstrap.min.css">
</head>
<body>
<script src=“js/angular.min.js"></script>
</body>
</html>
<script src=“js/app.js"></script>
Eduardo Mendes (edumendes@gmail.com)17
Criando o primeiro Módulo
var app = angular.module('livraria', [ ]); app.js
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="css/bootstrap.min.css">
</head>
<body >
<script src=“js/angular.min.js"></script>
</body>
</html>
<script src=“js/app.js"></script>
ng-app="livraria"
Eduardo Mendes (edumendes@gmail.com)
Expressions
18
Eduardo Mendes (edumendes@gmail.com)19
Expressions
Permite inserir valores dinâmicos no código HTML
<p>
O valor de 1 + 1 = {{1 + 1}}
</p>
<p>
O valor de 1 + 1 = 2
</p>
<p>
{{"Alô," + " mamãe"}}
</p>
<p>
Alô, mamãe
</p>
Eduardo Mendes (edumendes@gmail.com)
Controles e Dados
20
Eduardo Mendes (edumendes@gmail.com)21
Utilizando dados
var livro = {
titulo: 'O Senhor dos Aneis',
preco: 40.0,
descricao: ‘Descricao 1'
}
Objeto JS
Eduardo Mendes (edumendes@gmail.com)22
Controllers
Controlam o comportamento da aplicação em Angular,
através da definição de funções e valores
(function() {
var app = angular.module('livraria', []);
})();
Encapsule tudo em uma closure
Crie um controller
app.controller('LojaControle', function() {
});
var livro = {
titulo: 'O Senhor dos Aneis',
preco: 40.0,
descricao: ‘Descricao 1'
}
Eduardo Mendes (edumendes@gmail.com)23
Controllers
Controlam o comportamento da aplicação em Angular,
através da definição de funções e valores
(function() {
var app = angular.module('livraria', []);
})();
Encapsule tudo em uma closure
Crie um controller
app.controller('LojaControle', function() {
});
var livro = {
titulo: 'O Senhor dos Aneis',
preco: 40.0,
descricao: ‘Descricao 1'
}
this.produto = livro;
Cria uma propriedade
no controle para receber
o valor do livro
Eduardo Mendes (edumendes@gmail.com)24
O HTML
<!DOCTYPE html>
<html ng-app="livraria">
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" href="css/bootstrap.min.css"/>
</head>
<body>
<div>
<h1>Nome do Produto</h1>
<h2>R$ preco</h2>
<p>Descrição do Produto</p>
</div>
<script src="js/angular.min.js"></script>
<script src="js/app.js"></script>
</body>
</html>
Eduardo Mendes (edumendes@gmail.com)25
O HTML
<body >
<div>
<h1>Nome do Produto</h1>
<h2>R$ preco</h2>
<p>Descrição do Produto</p>
</div>
<script src="js/angular.min.js"></script>
<script src="js/app.js"></script>
</body>
</html>
ng-controller="LojaControle as loja"
Eduardo Mendes (edumendes@gmail.com)26
O HTML
<body >
<div>
</div>
<script src="js/angular.min.js"></script>
<script src="js/app.js"></script>
</body>
</html>
ng-controller="LojaControle as loja"
<h1>{{loja.produto.titulo}}</h1>
<h2>R$ {{loja.produto.preco}}</h2>
<p>{{loja.produto.descricao}}</p>
Eduardo Mendes (edumendes@gmail.com)
Exibição Condicional
27
Eduardo Mendes (edumendes@gmail.com)28
Exibição de um botão
condicionado a existir
quantidade em estoque
Eduardo Mendes (edumendes@gmail.com)
Diretiva

ng-show
29
Eduardo Mendes (edumendes@gmail.com)30
Adequando os dados à necessidade
var livro = {
titulo: 'O Senhor dos Aneis',
preco: 40.0,
descricao: ‘Descricao 1'
}
Eduardo Mendes (edumendes@gmail.com)31
Adequando os dados à necessidade
var livro = {
titulo: 'O Senhor dos Aneis',
preco: 40.0,
descricao: ‘Descricao 1'
}
,
quantidade: 10
Eduardo Mendes (edumendes@gmail.com)32
Adequando os dados à necessidade
var livro = {
titulo: 'O Senhor dos Aneis',
preco: 40.0,
descricao: ‘Descricao 1'
}
,
quantidade: 10
<body ng-controller="LojaControle as loja">

<div>

<div>

<h1>{{loja.produto.titulo}}</h1>

<h2>R$ {{loja.produto.preco}}</h2>

<p>{{loja.produto.descricao}}</p>

</div>
</div>
<button ng-show="{{loja.produto.quantidade > 0}}”>
Adicionar ao Carrinho
</button>
Eduardo Mendes (edumendes@gmail.com)33
Um acervo de livros
Normalmente se tem mais que um livro
app.controller('LojaControle', function() {
this.produto = livro;
});
var livro = {
titulo: 'O Senhor dos Aneis',
preco: 40.0,
descricao: 'Descricao 1',
quantidade: 10
}
Eduardo Mendes (edumendes@gmail.com)34
Um acervo de livros
Normalmente se tem mais que um livro
app.controller('LojaControle', function () {
this.acervo = livros;
});
var livros = [
{
titulo: 'O Senhor dos Aneis',
preco: 40.0,
descricao: 'Descricao 1',
quantidade: 10
}, {
titulo: 'A Saga Star Wars',
preco: 80.0,
descricao: 'Descricao 2',
quantidade: 0
}
]
Array
Eduardo Mendes (edumendes@gmail.com)
Diretiva

ng-repeat
35
Eduardo Mendes (edumendes@gmail.com)36
Aplicando o ng-repeat
<body ng-controller="LojaControle as loja">
<div >
<h1>{{loja.produto.titulo}}</h1>
<h2>R$ {{loja.produto.preco}}</h2>
<p>{{loja.produto.descricao}}</p>
<button ng-show="{{loja.produto.quantidade > 0}}”>
Adicionar ao Carrinho
</button>
</div>
</div>
ng-repeat="livro in loja.acervo"
Deve ser referenciado
pela variável livro
Eduardo Mendes (edumendes@gmail.com)37
Aplicando o ng-repeat
<body ng-controller="LojaControle as loja">
<div >
<h1>{{livro.titulo}}</h1>
<h2>R$ {{livro.preco}}</h2>
<p>{{livro.descricao}}</p>
<button ng-show="{{livro.quantidade > 0}}”>
Adicionar ao Carrinho
</button>
</div>
</div>
ng-repeat="livro in loja.acervo"
Repetirá a div
para cada livro no array
Eduardo Mendes (edumendes@gmail.com)
Diretivas vistas
ng-app : anexa o Módulo da aplicação à pagina
<html ng-app=“livraria">
ng-controller : anexa o função de Controle à pagina
<body ng-controller=“LojaControle as loja”>
ng-show/ng-hide : exibe algo mediante a avaliação de uma Expressão
<h1 ng-show=“algoBooleano”>Condicionado</h1>
ng-repeat : executa um laço para cada item de um Arrau
<li ng-repeat=“livro in loja.acervo”>
Eduardo Mendes (edumendes@gmail.com)39
Utilizando Abas
Controlador
propriedade
• aba
comportamentos
• setAba(aba)
• isSet(aba)
Eduardo Mendes (edumendes@gmail.com)40
AbasControle
app.controller('AbasControle', function() {
this.aba = 1;
this.setAba = function(aba) {
this.aba = aba;
};
this.isSet = function(aba) {
return this.aba == aba;
};
};
Eduardo Mendes (edumendes@gmail.com)
Diretiva

ng-click
41
permite especificar um comportamento
personalizado quando um elemento
é clicado
Eduardo Mendes (edumendes@gmail.com)42
O HTML das Abas
<section class="tab" ng-controller="AbasControle as aba">
<ul class="nav nav-pills">
<li><a href >Descrição</a></li>
<li><a href >Comentários</a></li>
</ul>
<div>
<h4>Descrição</h4>
<blockquote>{{livro.descricao}}</blockquote>
</div>
<div>
<h4>Comentários</h4>
<blockquote></blockquote>
</div>
</section>
aba 1
aba 2
ng-show
isSet(?)
ng-click
setAba(?)
Eduardo Mendes (edumendes@gmail.com)43
O HTML das Abas
<section class="tab" ng-controller="AbasControle as aba">
<ul class="nav nav-pills">
<li><a href >Descrição</a></li>
<li><a href >Comentários</a></li>
</ul>
<div ng-show="aba.isSet(1)">
<h4>Descrição</h4>
<blockquote>{{livro.descricao}}</blockquote>
</div>
<div ng-show="aba.isSet(2)">
<h4>Comentários</h4>
<blockquote></blockquote>
</div>
</section>
Eduardo Mendes (edumendes@gmail.com)44
O HTML das Abas
<section class="tab" ng-controller="AbasControle as aba">
<ul class="nav nav-pills">
<li><a href ng-click="aba.setAba(1)">Descrição</a></li>
<li><a href ng-click="aba.setAba(2)">Comentários</a></li>
</ul>
<div ng-show="aba.isSet(1)">
<h4>Descrição</h4>
<blockquote>{{livro.descricao}}</blockquote>
</div>
<div ng-show="aba.isSet(2)">
<h4>Comentários</h4>
<blockquote></blockquote>
</div>
</section>
Eduardo Mendes (edumendes@gmail.com)
Formulários
45
Eduardo Mendes (edumendes@gmail.com)46
Forms
Eduardo Mendes (edumendes@gmail.com)47
Adicionando comentarios
var livros = [
{
titulo: 'O Senhor dos Aneis',
preco: 40.0,
descricao: 'Descricao 1',
quantidade: 10,
comentarios : [{
autor: "Autor1",
texto: "Texto 1"
}, {
autor: "Autor2",
texto: "Texto 2"
}]
}
]
Array
Eduardo Mendes (edumendes@gmail.com)48
O HTML das Abas
<section class="tab" ng-controller="AbasControle as aba">
<ul class="nav nav-pills">
<li><a href ng-click="aba.setAba(1)">Descrição</a></li>
<li><a href ng-click="aba.setAba(2)">Comentários</a></li>
</ul>
<div ng-show="aba.isSet(1)">
<h4>Descrição</h4>
<blockquote>{{livro.descricao}}</blockquote>
</div>
<div ng-show="aba.isSet(2)">
<h4>Comentários</h4>
<blockquote></blockquote>
</div>
</section>
Eduardo Mendes (edumendes@gmail.com)49
O HTML dos Comentarios (ng-repeat)
<div ng-show="aba.isSet(2)">

<h4>Comentários</h4>

<blockquote ng-repeat="comentario in livro.comentarios">

{{comentario.autor}} disse: {{comentario.texto}}

</blockquote>

</div>
Eduardo Mendes (edumendes@gmail.com)50
O HTML do Formulario
<div ng-show="aba.isSet(2)">

<h4>Comentários</h4>

<blockquote ng-repeat="comentario in livro.comentarios">

{{comentario.autor}} disse: {{comentario.texto}}

</blockquote>

<div>

<form name=“comentarioForm”>
<p>

<input type="text"
placeholder="Seu nome"/>

</p>

<p><textarea
placeholder="Deixe seu comentario"></textarea>

</p>

<input type="submit" value="Adicionar" />

</form>

</div>

</div>
Eduardo Mendes (edumendes@gmail.com)51
O HTML do Formulario
<div ng-show="aba.isSet(2)">

<h4>Comentários</h4>

<blockquote ng-repeat="comentario in livro.comentarios">

{{comentario.autor}} disse: {{comentario.texto}}

</blockquote>

<div>

<form name=“comentarioForm”>
<blockquote>

{{comentario.autor}} disse: {{comentario.texto}}

</blockquote>

<p>

<input type="text"

placeholder="Seu nome"/>

</p>

<p><textarea
placeholder="Deixe seu comentario"></textarea>

</p>

<input type="submit" value="Adicionar" />

</form>

</div>

</div>
Eduardo Mendes (edumendes@gmail.com)
Diretiva

ng-model
52
vincula o valor de um input, select, textarea
a uma propriedade
Eduardo Mendes (edumendes@gmail.com)53
O HTML do Formulario
<div ng-show="aba.isSet(2)">

<h4>Comentários</h4>

<blockquote ng-repeat="comentario in livro.comentarios">

{{comentario.autor}} disse: {{comentario.texto}}

</blockquote>

<div>

<form name=“comentarioForm”>
<blockquote>

{{comentario.autor}} disse: {{comentario.texto}}

</blockquote>

<p>

<input type="text"

placeholder="Seu nome"/>

</p>

<p><textarea
placeholder="Deixe seu comentario"></textarea>

</p>

<input type="submit" value="Adicionar" />

</form>

</div>

</div>
Eduardo Mendes (edumendes@gmail.com)54
O HTML do Formulario
<div ng-show="aba.isSet(2)">

<h4>Comentários</h4>

<blockquote ng-repeat="comentario in livro.comentarios">

{{comentario.autor}} disse: {{comentario.texto}}

</blockquote>

<div>

<form name=“comentarioForm”>
<blockquote>

{{comentario.autor}} disse: {{comentario.texto}}

</blockquote>

<p>

<input type="text" ng-model="comentario.autor"

placeholder="Seu nome"/>

</p>

<p><textarea ng-model=“comentario.texto"
placeholder="Deixe seu comentario"></textarea>

</p>

<input type="submit" value="Adicionar" />

</form>

</div>

</div>
Eduardo Mendes (edumendes@gmail.com)
Submetendo valores
55
Eduardo Mendes (edumendes@gmail.com)56
Forms
Controlador
propriedade
• comentario
comportamentos
• addComentario(livro)
Eduardo Mendes (edumendes@gmail.com)57
ComentarioControle
app.controller('ComentarioControle', function() {
this.comentario = {};
});
Eduardo Mendes (edumendes@gmail.com)58
O HTML do Formulario
<div ng-show="aba.isSet(2)">

<h4>Comentários</h4>

<blockquote ng-repeat="comentario in livro.comentarios">

{{comentario.autor}} disse: {{comentario.texto}}

</blockquote>

<div>

<form name=“comentarioForm”>
<blockquote>

{{comentario.autor}} disse: {{comentario.texto}}

</blockquote>

<p>

<input type="text" ng-model="comentario.autor"

placeholder="Seu nome"/>

</p>

<p><textarea ng-model=“comentario.texto"
placeholder="Deixe seu comentario"></textarea>

</p>

<input type="submit" value="Adicionar" />

</form>

</div>

</div>
Eduardo Mendes (edumendes@gmail.com)59
O HTML do Formulario (ng-model)


<form name=“comentarioForm"
ng-controller="ComentarioControle as cmtControle”>
<blockquote>…</blockquote>

<p>

<input type="text" ng-model="comentario.autor"

placeholder="Seu nome"/>

</p>

<p><textarea ng-model=“comentario.texto”
placeholder="Deixe seu comentario"></textarea>

</p>

<input type="submit" value="Adicionar" />

</form>

Eduardo Mendes (edumendes@gmail.com)60
O HTML do Formulario (ng-model)


<form name=“comentarioForm"
ng-controller="ComentarioControle as cmtControle”>
<blockquote>…</blockquote>

<p>

<input type="text" ng-model="cmtControle.comentario.autor"

placeholder="Seu nome"/>

</p>

<p><textarea ng-model=“cmtControle.comentario.texto”
placeholder="Deixe seu comentario"></textarea>

</p>

<input type="submit" value="Adicionar" />

</form>

Eduardo Mendes (edumendes@gmail.com)
Diretiva

ng-submit
61
permite vincular comportamentos
a um evento onsubmit
Eduardo Mendes (edumendes@gmail.com)62
O HTML do Formulario (ng-model)


<form name=“comentarioForm"
ng-controller="ComentarioControle as cmtControle”>
<blockquote>…</blockquote>

<p>

<input type="text" ng-model="cmtControle.comentario.autor"

placeholder="Seu nome"/>

</p>

<p><textarea ng-model=“cmtControle.comentario.texto”
placeholder="Deixe seu comentario"></textarea>

</p>

<input type="submit" value="Adicionar" />

</form>

Eduardo Mendes (edumendes@gmail.com)63
O HTML do Formulario (ng-model)


<form name=“comentarioForm"
ng-controller="ComentarioControle as cmtControle”
ng-submit="cmtControle.addComentario(livro)” >
<blockquote>…</blockquote>

<p>

<input type="text" ng-model="cmtControle.comentario.autor"

placeholder="Seu nome"/>

</p>

<p><textarea ng-model=“cmtControle.comentario.texto”
placeholder="Deixe seu comentario"></textarea>

</p>

<input type="submit" value="Adicionar" />

</form>

Eduardo Mendes (edumendes@gmail.com)64
ComentarioControle
app.controller('ComentarioControle', function() {
this.comentario = {};
this.addComentario = function(livro) {
livro.comentarios.push(this.comentario);
};
});
Eduardo Mendes (edumendes@gmail.com)65
ComentarioControle
app.controller('ComentarioControle', function() {
this.comentario = {};
this.addComentario = function(livro) {
livro.comentarios.push(this.comentario);
this.comentario = {};
};
});
Eduardo Mendes (edumendes@gmail.com)66
Eduardo Mendes (edumendes@gmail.com)
Validações
67
Eduardo Mendes (edumendes@gmail.com)68
Desabilitando a validação padrão


<form name=“comentarioForm"
ng-controller="ComentarioControle as cmtControle”
ng-submit="cmtControle.addComentario(livro)” >
<blockquote>…</blockquote>

<p>

<input type="text" ng-model="cmtControle.comentario.autor"

placeholder="Seu nome"/>

</p>

<p><textarea ng-model=“cmtControle.comentario.texto”
placeholder="Deixe seu comentario"></textarea>

</p>

<input type="submit" value="Adicionar" />

</form>

Eduardo Mendes (edumendes@gmail.com)69
Desabilitando a validação padrão


<form name=“comentarioForm"
ng-controller="ComentarioControle as cmtControle”
ng-submit="cmtControle.addComentario(livro)” novalidate>
<blockquote>…</blockquote>

<p>

<input type="text" ng-model="cmtControle.comentario.autor"

placeholder="Seu nome"/>

</p>

<p><textarea ng-model=“cmtControle.comentario.texto”
placeholder="Deixe seu comentario"></textarea>

</p>

<input type="submit" value="Adicionar" />

</form>

Eduardo Mendes (edumendes@gmail.com)70
Desabilitando a validação padrão


<form name=“comentarioForm"
ng-controller="ComentarioControle as cmtControle”
ng-submit="cmtControle.addComentario(livro)” novalidate>
<blockquote>…</blockquote>

<p>

<input type="text" ng-model="cmtControle.comentario.autor"

placeholder="Seu nome” required/>

</p>

<p><textarea ng-model=“cmtControle.comentario.texto”
placeholder="Deixe seu comentario” required> </textarea>

</p>

<input type="submit" value="Adicionar" />

</form>

Eduardo Mendes (edumendes@gmail.com)
$valid
71
propriedade form no Angular
que indica se o formuário é válido
Eduardo Mendes (edumendes@gmail.com)72
Desabilitando a validação padrão


<form name=“comentarioForm"
ng-controller="ComentarioControle as cmtControle”
ng-submit="cmtControle.addComentario(livro)” novalidate>
<blockquote>…</blockquote>

<p>

<input type="text" ng-model="cmtControle.comentario.autor"

placeholder="Seu nome” required/>

</p>

<p><textarea ng-model=“cmtControle.comentario.texto”
placeholder="Deixe seu comentario” required> </textarea>

</p>

<input type="submit" value="Adicionar" />

</form>

Eduardo Mendes (edumendes@gmail.com)73
Desabilitando a validação padrão


<form name=“comentarioForm"
ng-controller="ComentarioControle as cmtControle”
ng-submit="cmtControle.addComentario(livro)” novalidate>
<blockquote>…</blockquote>

<p>

<input type="text" ng-model="cmtControle.comentario.autor"

placeholder="Seu nome” required/>

</p>

<p><textarea ng-model=“cmtControle.comentario.texto”
placeholder="Deixe seu comentario” required> </textarea>

</p>
<div>O formulario é ${{comentarioForm.$valid}}</div>

<input type="submit" value="Adicionar" />

</form>

Eduardo Mendes (edumendes@gmail.com)74
Desabilitando a validação padrão


<form name=“comentarioForm"
ng-controller="ComentarioControle as cmtControle”
ng-submit="cmtControle.addComentario(livro)” novalidate>
<blockquote>…</blockquote>

<p>

<input type="text" ng-model="cmtControle.comentario.autor"

placeholder="Seu nome” required/>

</p>

<p><textarea ng-model=“cmtControle.comentario.texto”
placeholder="Deixe seu comentario” required> </textarea>

</p>
<div>O formulario é ${{comentarioForm.$valid}}</div>

<input type="submit" value="Adicionar" />

</form>

Eduardo Mendes (edumendes@gmail.com)75
Desabilitando a validação padrão


<form name=“comentarioForm"
ng-controller="ComentarioControle as cmtControle”
ng-submit=“comentarioForm.$valid && cmtControle.addComentario(livro)”
novalidate>
<blockquote>…</blockquote>

<p>

<input type="text" ng-model="cmtControle.comentario.autor"

placeholder="Seu nome” required/>

</p>

<p><textarea ng-model=“cmtControle.comentario.texto”
placeholder="Deixe seu comentario” required> </textarea>

</p>
<div>O formulario é ${{comentarioForm.$valid}}</div>

<input type="submit" value="Adicionar" />

</form>

Eduardo Mendes (edumendes@gmail.com)76
Classe no Input pelo Angular
<input name="autor“ type="email“ ng-model=“cmtControle.comentario.autor" required/>
antes de digitar digitado email inválido digitado email válido
.ng-pristine
.ng-invalid
.ng-dirty
.ng-invalid
.ng-dirty
.ng-valid
Eduardo Mendes (edumendes@gmail.com)77
CSS
.ng-invalid.ng-dirty {

border-color: darkred;

}



.ng-invalid.ng-dirty {

border-color: greenyellow;

}
Eduardo Mendes (edumendes@gmail.com)
Projeto
78
Eduardo Mendes (edumendes@gmail.com)79
Projeto
Eduardo Mendes (edumendes@gmail.com)
Diretivas
Personalizadas
80
Eduardo Mendes (edumendes@gmail.com)81
Como reaproveitar código?
<h2>
{{livro.titulo}}
<em class="pull-right">R$ {{livro.preco}}</em>
</h2>
Poderia aparecer em várias partes na aplicação
Eduardo Mendes (edumendes@gmail.com)82
Como reaproveitar código?
<h2>
{{livro.titulo}}
<em class="pull-right">R$ {{livro.preco}}</em>
</h2>
Criar um arquivo html e reutilizá-lo
Eduardo Mendes (edumendes@gmail.com)83
Como reaproveitar código?
<h2>
{{livro.titulo}}
<em class="pull-right">R$ {{livro.preco}}</em>
</h2> index.html
Eduardo Mendes (edumendes@gmail.com)84
Como reaproveitar código?
<h2>
</h2>
index.html
{{livro.titulo}}
<em class="pull-right">R$ {{livro.preco}}</em>
livro-preco.html
Eduardo Mendes (edumendes@gmail.com)85
Como reaproveitar código?
<h2 ng-include=“'livro-preco.html'”>
</h2>
index.html
{{livro.titulo}}
<em class="pull-right">R$ {{livro.preco}}</em>
livro-preco.html
Eduardo Mendes (edumendes@gmail.com)86
Como reaproveitar código?
<h2 ng-include=“'livro-preco.html'”>
</h2>
index.html
{{livro.titulo}}
<em class="pull-right">R$ {{livro.preco}}</em>
livro-preco.html
Onde está a diretiva???
Eduardo Mendes (edumendes@gmail.com)87
Como reaproveitar código?
<livro-preco></livro-preco>
index.html
{{livro.titulo}}
<em class="pull-right">R$ {{livro.preco}}</em>
livro-preco.html
Onde está a diretiva???
Eduardo Mendes (edumendes@gmail.com)88
Como reaproveitar código?
<livro-preco></livro-preco>
app.directive('livroPreco', function() {
return {
};
}); app.js
Eduardo Mendes (edumendes@gmail.com)89
Como reaproveitar código?
<livro-preco></livro-preco>
app.js
app.directive('livroPreco', function() {
return {
restrict: 'E',
templateUrl: 'livro-preco.html'
};
});
Diretiva como um elemento
Eduardo Mendes (edumendes@gmail.com)90
Como reaproveitar código?
<h3 livro-preco></h3>
app.js
app.directive('livroPreco', function() {
return {
restrict: 'A',
templateUrl: 'livro-preco.html'
};
});
Diretiva como um atributo
Eduardo Mendes (edumendes@gmail.com)91
Exercício
CRIAR
<livro-descricao></livro-descricao>
<div livro-comentarios></div>
Eduardo Mendes (edumendes@gmail.com)
E se o template precisasse

de um Controller???
92
Eduardo Mendes (edumendes@gmail.com)93
Template dependente de controller
<section class="tab" ng-controller="AbasControle as aba">
<ul class="nav nav-pills">
<li><a href ng-click="aba.setAba(1)">Descrição</a></li>
<li><a href ng-click="aba.setAba(2)">Comentários</a></li>
</ul>
<livro-descricao></livro-descricao>
<div livro-comentarios></div>
</section> index.html
Eduardo Mendes (edumendes@gmail.com)94
Template dependente de controller
ng-controller="AbasControle as aba"
index.html
<section class="tab">
<ul class="nav nav-pills">
<li><a href ng-click="aba.setAba(1)">Descrição</a></li>
<li><a href ng-click="aba.setAba(2)">Comentários</a></li>
</ul>
<livro-descricao></livro-descricao>
<div livro-comentarios></div>
</section>
livro-abas.html
Eduardo Mendes (edumendes@gmail.com)95
Adiciona a diretiva
index.html
<section class="tab">
<ul class="nav nav-pills">
<li><a href ng-click="aba.setAba(1)">Descrição</a></li>
<li><a href ng-click="aba.setAba(2)">Comentários</a></li>
</ul>
<livro-descricao></livro-descricao>
<div livro-comentarios></div>
</section>
livro-abas.html
<livro-abas ng-controller="AbasControle as aba"></livro-abas>
Eduardo Mendes (edumendes@gmail.com)96
Adiciona a diretiva
index.html
app.js
<livro-abas ng-controller="AbasControle as aba"></livro-abas>
app.directive('livroAbas', function() {
return {
restrict: 'E',
templateUrl: 'livro-abas.html'
};
});
Eduardo Mendes (edumendes@gmail.com)97
Adiciona a diretiva
index.html
app.js
<livro-abas ng-controller="AbasControle as aba"></livro-abas>
app.directive('livroAbas', function() {
return {
restrict: 'E',
templateUrl: 'livro-abas.html'
};
});
app.controller('AbasControle', function() {
. . .
});
Eduardo Mendes (edumendes@gmail.com)98
Adiciona a diretiva
index.html
app.js
<livro-abas ng-controller="AbasControle as aba"></livro-abas>
app.directive('livroAbas', function() {
return {
restrict: 'E',
templateUrl: ‘livro-abas.html’,
controller: function() {
. . .
}
};
});
Eduardo Mendes (edumendes@gmail.com)99
Adiciona a diretiva
index.html
app.js
<livro-abas ng-controller="AbasControle as aba"></livro-abas>
app.directive('livroAbas', function() {
return {
restrict: 'E',
templateUrl: ‘livro-abas.html’,
controller: function() {
. . .
},
controllerAs: ‘aba’
};
});
Eduardo Mendes (edumendes@gmail.com)100
Adiciona a diretiva
index.html
app.js
<livro-abas></livro-abas>
app.directive('livroAbas', function() {
return {
restrict: 'E',
templateUrl: ‘livro-abas.html’,
controller: function() {
. . .
},
controllerAs: ‘aba’
};
});

Angular JS - Fundamentos

  • 1.
    Eduardo Mendes deOliveira edumendes@gmail.com
  • 2.
  • 3.
    Eduardo Mendes (edumendes@gmail.com) AngularJS 3 Ajudaa organizar o JS Boa escolha para sites dinâmicos Se comunica com jQuery Possibilita a criação de sites interativos Fácil de testar Framework JS para o lado do cliente capaz de adicionar interatividade ao HTML
  • 4.
  • 5.
  • 6.
    Eduardo Mendes (edumendes@gmail.com) Diretivas Módulos Controles Expressões 6 AnotaçõesHTML que disparam comportamentos JS Onde estão localizados os componentes Onde se adicionar comportamento à aplicação A forma de exibir os valores nas páginas
  • 7.
  • 8.
    Eduardo Mendes (edumendes@gmail.com)8 Directives UmaDirective é um marcador em um tag HTML, como um atributo, que faz a ponte
 entre o HTML e um código JS <!DOCTYPE html> <html> <body> ... </body> </html> function HelloAngular() { alert("Hello from Angular, World"); }
  • 9.
    Eduardo Mendes (edumendes@gmail.com)9 Directives <!DOCTYPEhtml> <html> <body > ... </body> </html> function HelloAngular() { alert("Hello from Angular, World"); }ng-controller="HelloAngular"
  • 10.
  • 11.
    Eduardo Mendes (edumendes@gmail.com)11 UtilizandoAngularJS download AngularJS carregue-o em seu documento HTML <script src=“angular.min.js”></script> carregue seus componentes angularjs 1 2 3 utilizaremos também Bootstrap <link href=“bootstrap.min.css” ... /> 4 <script src=“app.js”></script>
  • 12.
    Eduardo Mendes (edumendes@gmail.com)12 Iniciandocom AngularJS <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="css/bootstrap.min.css"> </head> <body> <script src=“js/angular.min.js"></script> <script src=“js/app.js”></script> </body> </html>
  • 13.
  • 14.
    Eduardo Mendes (edumendes@gmail.com)14 Módulos Ondesão escritos partes de uma aplicação AngularJS Tornam o código mais fácil de manter e de entender Também serve para comunicar as dependências da aplicação Módulo podem depender de outros módulos
  • 15.
    Eduardo Mendes (edumendes@gmail.com)15 Criandoo primeiro Módulo var app = angular.module('livraria', [ ]); AngularJS Nome da Aplicação Dependências
  • 16.
    Eduardo Mendes (edumendes@gmail.com)16 Criandoo primeiro Módulo var app = angular.module('livraria', [ ]); app.js <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="css/bootstrap.min.css"> </head> <body> <script src=“js/angular.min.js"></script> </body> </html> <script src=“js/app.js"></script>
  • 17.
    Eduardo Mendes (edumendes@gmail.com)17 Criandoo primeiro Módulo var app = angular.module('livraria', [ ]); app.js <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="css/bootstrap.min.css"> </head> <body > <script src=“js/angular.min.js"></script> </body> </html> <script src=“js/app.js"></script> ng-app="livraria"
  • 18.
  • 19.
    Eduardo Mendes (edumendes@gmail.com)19 Expressions Permiteinserir valores dinâmicos no código HTML <p> O valor de 1 + 1 = {{1 + 1}} </p> <p> O valor de 1 + 1 = 2 </p> <p> {{"Alô," + " mamãe"}} </p> <p> Alô, mamãe </p>
  • 20.
  • 21.
    Eduardo Mendes (edumendes@gmail.com)21 Utilizandodados var livro = { titulo: 'O Senhor dos Aneis', preco: 40.0, descricao: ‘Descricao 1' } Objeto JS
  • 22.
    Eduardo Mendes (edumendes@gmail.com)22 Controllers Controlamo comportamento da aplicação em Angular, através da definição de funções e valores (function() { var app = angular.module('livraria', []); })(); Encapsule tudo em uma closure Crie um controller app.controller('LojaControle', function() { }); var livro = { titulo: 'O Senhor dos Aneis', preco: 40.0, descricao: ‘Descricao 1' }
  • 23.
    Eduardo Mendes (edumendes@gmail.com)23 Controllers Controlamo comportamento da aplicação em Angular, através da definição de funções e valores (function() { var app = angular.module('livraria', []); })(); Encapsule tudo em uma closure Crie um controller app.controller('LojaControle', function() { }); var livro = { titulo: 'O Senhor dos Aneis', preco: 40.0, descricao: ‘Descricao 1' } this.produto = livro; Cria uma propriedade no controle para receber o valor do livro
  • 24.
    Eduardo Mendes (edumendes@gmail.com)24 OHTML <!DOCTYPE html> <html ng-app="livraria"> <head> <meta charset="utf-8"/> <link rel="stylesheet" href="css/bootstrap.min.css"/> </head> <body> <div> <h1>Nome do Produto</h1> <h2>R$ preco</h2> <p>Descrição do Produto</p> </div> <script src="js/angular.min.js"></script> <script src="js/app.js"></script> </body> </html>
  • 25.
    Eduardo Mendes (edumendes@gmail.com)25 OHTML <body > <div> <h1>Nome do Produto</h1> <h2>R$ preco</h2> <p>Descrição do Produto</p> </div> <script src="js/angular.min.js"></script> <script src="js/app.js"></script> </body> </html> ng-controller="LojaControle as loja"
  • 26.
    Eduardo Mendes (edumendes@gmail.com)26 OHTML <body > <div> </div> <script src="js/angular.min.js"></script> <script src="js/app.js"></script> </body> </html> ng-controller="LojaControle as loja" <h1>{{loja.produto.titulo}}</h1> <h2>R$ {{loja.produto.preco}}</h2> <p>{{loja.produto.descricao}}</p>
  • 27.
  • 28.
    Eduardo Mendes (edumendes@gmail.com)28 Exibiçãode um botão condicionado a existir quantidade em estoque
  • 29.
  • 30.
    Eduardo Mendes (edumendes@gmail.com)30 Adequandoos dados à necessidade var livro = { titulo: 'O Senhor dos Aneis', preco: 40.0, descricao: ‘Descricao 1' }
  • 31.
    Eduardo Mendes (edumendes@gmail.com)31 Adequandoos dados à necessidade var livro = { titulo: 'O Senhor dos Aneis', preco: 40.0, descricao: ‘Descricao 1' } , quantidade: 10
  • 32.
    Eduardo Mendes (edumendes@gmail.com)32 Adequandoos dados à necessidade var livro = { titulo: 'O Senhor dos Aneis', preco: 40.0, descricao: ‘Descricao 1' } , quantidade: 10 <body ng-controller="LojaControle as loja">
 <div>
 <div>
 <h1>{{loja.produto.titulo}}</h1>
 <h2>R$ {{loja.produto.preco}}</h2>
 <p>{{loja.produto.descricao}}</p>
 </div> </div> <button ng-show="{{loja.produto.quantidade > 0}}”> Adicionar ao Carrinho </button>
  • 33.
    Eduardo Mendes (edumendes@gmail.com)33 Umacervo de livros Normalmente se tem mais que um livro app.controller('LojaControle', function() { this.produto = livro; }); var livro = { titulo: 'O Senhor dos Aneis', preco: 40.0, descricao: 'Descricao 1', quantidade: 10 }
  • 34.
    Eduardo Mendes (edumendes@gmail.com)34 Umacervo de livros Normalmente se tem mais que um livro app.controller('LojaControle', function () { this.acervo = livros; }); var livros = [ { titulo: 'O Senhor dos Aneis', preco: 40.0, descricao: 'Descricao 1', quantidade: 10 }, { titulo: 'A Saga Star Wars', preco: 80.0, descricao: 'Descricao 2', quantidade: 0 } ] Array
  • 35.
  • 36.
    Eduardo Mendes (edumendes@gmail.com)36 Aplicandoo ng-repeat <body ng-controller="LojaControle as loja"> <div > <h1>{{loja.produto.titulo}}</h1> <h2>R$ {{loja.produto.preco}}</h2> <p>{{loja.produto.descricao}}</p> <button ng-show="{{loja.produto.quantidade > 0}}”> Adicionar ao Carrinho </button> </div> </div> ng-repeat="livro in loja.acervo" Deve ser referenciado pela variável livro
  • 37.
    Eduardo Mendes (edumendes@gmail.com)37 Aplicandoo ng-repeat <body ng-controller="LojaControle as loja"> <div > <h1>{{livro.titulo}}</h1> <h2>R$ {{livro.preco}}</h2> <p>{{livro.descricao}}</p> <button ng-show="{{livro.quantidade > 0}}”> Adicionar ao Carrinho </button> </div> </div> ng-repeat="livro in loja.acervo" Repetirá a div para cada livro no array
  • 38.
    Eduardo Mendes (edumendes@gmail.com) Diretivasvistas ng-app : anexa o Módulo da aplicação à pagina <html ng-app=“livraria"> ng-controller : anexa o função de Controle à pagina <body ng-controller=“LojaControle as loja”> ng-show/ng-hide : exibe algo mediante a avaliação de uma Expressão <h1 ng-show=“algoBooleano”>Condicionado</h1> ng-repeat : executa um laço para cada item de um Arrau <li ng-repeat=“livro in loja.acervo”>
  • 39.
    Eduardo Mendes (edumendes@gmail.com)39 UtilizandoAbas Controlador propriedade • aba comportamentos • setAba(aba) • isSet(aba)
  • 40.
    Eduardo Mendes (edumendes@gmail.com)40 AbasControle app.controller('AbasControle',function() { this.aba = 1; this.setAba = function(aba) { this.aba = aba; }; this.isSet = function(aba) { return this.aba == aba; }; };
  • 41.
    Eduardo Mendes (edumendes@gmail.com) Diretiva
 ng-click 41 permiteespecificar um comportamento personalizado quando um elemento é clicado
  • 42.
    Eduardo Mendes (edumendes@gmail.com)42 OHTML das Abas <section class="tab" ng-controller="AbasControle as aba"> <ul class="nav nav-pills"> <li><a href >Descrição</a></li> <li><a href >Comentários</a></li> </ul> <div> <h4>Descrição</h4> <blockquote>{{livro.descricao}}</blockquote> </div> <div> <h4>Comentários</h4> <blockquote></blockquote> </div> </section> aba 1 aba 2 ng-show isSet(?) ng-click setAba(?)
  • 43.
    Eduardo Mendes (edumendes@gmail.com)43 OHTML das Abas <section class="tab" ng-controller="AbasControle as aba"> <ul class="nav nav-pills"> <li><a href >Descrição</a></li> <li><a href >Comentários</a></li> </ul> <div ng-show="aba.isSet(1)"> <h4>Descrição</h4> <blockquote>{{livro.descricao}}</blockquote> </div> <div ng-show="aba.isSet(2)"> <h4>Comentários</h4> <blockquote></blockquote> </div> </section>
  • 44.
    Eduardo Mendes (edumendes@gmail.com)44 OHTML das Abas <section class="tab" ng-controller="AbasControle as aba"> <ul class="nav nav-pills"> <li><a href ng-click="aba.setAba(1)">Descrição</a></li> <li><a href ng-click="aba.setAba(2)">Comentários</a></li> </ul> <div ng-show="aba.isSet(1)"> <h4>Descrição</h4> <blockquote>{{livro.descricao}}</blockquote> </div> <div ng-show="aba.isSet(2)"> <h4>Comentários</h4> <blockquote></blockquote> </div> </section>
  • 45.
  • 46.
  • 47.
    Eduardo Mendes (edumendes@gmail.com)47 Adicionandocomentarios var livros = [ { titulo: 'O Senhor dos Aneis', preco: 40.0, descricao: 'Descricao 1', quantidade: 10, comentarios : [{ autor: "Autor1", texto: "Texto 1" }, { autor: "Autor2", texto: "Texto 2" }] } ] Array
  • 48.
    Eduardo Mendes (edumendes@gmail.com)48 OHTML das Abas <section class="tab" ng-controller="AbasControle as aba"> <ul class="nav nav-pills"> <li><a href ng-click="aba.setAba(1)">Descrição</a></li> <li><a href ng-click="aba.setAba(2)">Comentários</a></li> </ul> <div ng-show="aba.isSet(1)"> <h4>Descrição</h4> <blockquote>{{livro.descricao}}</blockquote> </div> <div ng-show="aba.isSet(2)"> <h4>Comentários</h4> <blockquote></blockquote> </div> </section>
  • 49.
    Eduardo Mendes (edumendes@gmail.com)49 OHTML dos Comentarios (ng-repeat) <div ng-show="aba.isSet(2)">
 <h4>Comentários</h4>
 <blockquote ng-repeat="comentario in livro.comentarios">
 {{comentario.autor}} disse: {{comentario.texto}}
 </blockquote>
 </div>
  • 50.
    Eduardo Mendes (edumendes@gmail.com)50 OHTML do Formulario <div ng-show="aba.isSet(2)">
 <h4>Comentários</h4>
 <blockquote ng-repeat="comentario in livro.comentarios">
 {{comentario.autor}} disse: {{comentario.texto}}
 </blockquote>
 <div>
 <form name=“comentarioForm”> <p>
 <input type="text" placeholder="Seu nome"/>
 </p>
 <p><textarea placeholder="Deixe seu comentario"></textarea>
 </p>
 <input type="submit" value="Adicionar" />
 </form>
 </div>
 </div>
  • 51.
    Eduardo Mendes (edumendes@gmail.com)51 OHTML do Formulario <div ng-show="aba.isSet(2)">
 <h4>Comentários</h4>
 <blockquote ng-repeat="comentario in livro.comentarios">
 {{comentario.autor}} disse: {{comentario.texto}}
 </blockquote>
 <div>
 <form name=“comentarioForm”> <blockquote>
 {{comentario.autor}} disse: {{comentario.texto}}
 </blockquote>
 <p>
 <input type="text"
 placeholder="Seu nome"/>
 </p>
 <p><textarea placeholder="Deixe seu comentario"></textarea>
 </p>
 <input type="submit" value="Adicionar" />
 </form>
 </div>
 </div>
  • 52.
    Eduardo Mendes (edumendes@gmail.com) Diretiva
 ng-model 52 vinculao valor de um input, select, textarea a uma propriedade
  • 53.
    Eduardo Mendes (edumendes@gmail.com)53 OHTML do Formulario <div ng-show="aba.isSet(2)">
 <h4>Comentários</h4>
 <blockquote ng-repeat="comentario in livro.comentarios">
 {{comentario.autor}} disse: {{comentario.texto}}
 </blockquote>
 <div>
 <form name=“comentarioForm”> <blockquote>
 {{comentario.autor}} disse: {{comentario.texto}}
 </blockquote>
 <p>
 <input type="text"
 placeholder="Seu nome"/>
 </p>
 <p><textarea placeholder="Deixe seu comentario"></textarea>
 </p>
 <input type="submit" value="Adicionar" />
 </form>
 </div>
 </div>
  • 54.
    Eduardo Mendes (edumendes@gmail.com)54 OHTML do Formulario <div ng-show="aba.isSet(2)">
 <h4>Comentários</h4>
 <blockquote ng-repeat="comentario in livro.comentarios">
 {{comentario.autor}} disse: {{comentario.texto}}
 </blockquote>
 <div>
 <form name=“comentarioForm”> <blockquote>
 {{comentario.autor}} disse: {{comentario.texto}}
 </blockquote>
 <p>
 <input type="text" ng-model="comentario.autor"
 placeholder="Seu nome"/>
 </p>
 <p><textarea ng-model=“comentario.texto" placeholder="Deixe seu comentario"></textarea>
 </p>
 <input type="submit" value="Adicionar" />
 </form>
 </div>
 </div>
  • 55.
  • 56.
    Eduardo Mendes (edumendes@gmail.com)56 Forms Controlador propriedade •comentario comportamentos • addComentario(livro)
  • 57.
  • 58.
    Eduardo Mendes (edumendes@gmail.com)58 OHTML do Formulario <div ng-show="aba.isSet(2)">
 <h4>Comentários</h4>
 <blockquote ng-repeat="comentario in livro.comentarios">
 {{comentario.autor}} disse: {{comentario.texto}}
 </blockquote>
 <div>
 <form name=“comentarioForm”> <blockquote>
 {{comentario.autor}} disse: {{comentario.texto}}
 </blockquote>
 <p>
 <input type="text" ng-model="comentario.autor"
 placeholder="Seu nome"/>
 </p>
 <p><textarea ng-model=“comentario.texto" placeholder="Deixe seu comentario"></textarea>
 </p>
 <input type="submit" value="Adicionar" />
 </form>
 </div>
 </div>
  • 59.
    Eduardo Mendes (edumendes@gmail.com)59 OHTML do Formulario (ng-model) 
 <form name=“comentarioForm" ng-controller="ComentarioControle as cmtControle”> <blockquote>…</blockquote>
 <p>
 <input type="text" ng-model="comentario.autor"
 placeholder="Seu nome"/>
 </p>
 <p><textarea ng-model=“comentario.texto” placeholder="Deixe seu comentario"></textarea>
 </p>
 <input type="submit" value="Adicionar" />
 </form>

  • 60.
    Eduardo Mendes (edumendes@gmail.com)60 OHTML do Formulario (ng-model) 
 <form name=“comentarioForm" ng-controller="ComentarioControle as cmtControle”> <blockquote>…</blockquote>
 <p>
 <input type="text" ng-model="cmtControle.comentario.autor"
 placeholder="Seu nome"/>
 </p>
 <p><textarea ng-model=“cmtControle.comentario.texto” placeholder="Deixe seu comentario"></textarea>
 </p>
 <input type="submit" value="Adicionar" />
 </form>

  • 61.
  • 62.
    Eduardo Mendes (edumendes@gmail.com)62 OHTML do Formulario (ng-model) 
 <form name=“comentarioForm" ng-controller="ComentarioControle as cmtControle”> <blockquote>…</blockquote>
 <p>
 <input type="text" ng-model="cmtControle.comentario.autor"
 placeholder="Seu nome"/>
 </p>
 <p><textarea ng-model=“cmtControle.comentario.texto” placeholder="Deixe seu comentario"></textarea>
 </p>
 <input type="submit" value="Adicionar" />
 </form>

  • 63.
    Eduardo Mendes (edumendes@gmail.com)63 OHTML do Formulario (ng-model) 
 <form name=“comentarioForm" ng-controller="ComentarioControle as cmtControle” ng-submit="cmtControle.addComentario(livro)” > <blockquote>…</blockquote>
 <p>
 <input type="text" ng-model="cmtControle.comentario.autor"
 placeholder="Seu nome"/>
 </p>
 <p><textarea ng-model=“cmtControle.comentario.texto” placeholder="Deixe seu comentario"></textarea>
 </p>
 <input type="submit" value="Adicionar" />
 </form>

  • 64.
    Eduardo Mendes (edumendes@gmail.com)64 ComentarioControle app.controller('ComentarioControle',function() { this.comentario = {}; this.addComentario = function(livro) { livro.comentarios.push(this.comentario); }; });
  • 65.
    Eduardo Mendes (edumendes@gmail.com)65 ComentarioControle app.controller('ComentarioControle',function() { this.comentario = {}; this.addComentario = function(livro) { livro.comentarios.push(this.comentario); this.comentario = {}; }; });
  • 66.
  • 67.
  • 68.
    Eduardo Mendes (edumendes@gmail.com)68 Desabilitandoa validação padrão 
 <form name=“comentarioForm" ng-controller="ComentarioControle as cmtControle” ng-submit="cmtControle.addComentario(livro)” > <blockquote>…</blockquote>
 <p>
 <input type="text" ng-model="cmtControle.comentario.autor"
 placeholder="Seu nome"/>
 </p>
 <p><textarea ng-model=“cmtControle.comentario.texto” placeholder="Deixe seu comentario"></textarea>
 </p>
 <input type="submit" value="Adicionar" />
 </form>

  • 69.
    Eduardo Mendes (edumendes@gmail.com)69 Desabilitandoa validação padrão 
 <form name=“comentarioForm" ng-controller="ComentarioControle as cmtControle” ng-submit="cmtControle.addComentario(livro)” novalidate> <blockquote>…</blockquote>
 <p>
 <input type="text" ng-model="cmtControle.comentario.autor"
 placeholder="Seu nome"/>
 </p>
 <p><textarea ng-model=“cmtControle.comentario.texto” placeholder="Deixe seu comentario"></textarea>
 </p>
 <input type="submit" value="Adicionar" />
 </form>

  • 70.
    Eduardo Mendes (edumendes@gmail.com)70 Desabilitandoa validação padrão 
 <form name=“comentarioForm" ng-controller="ComentarioControle as cmtControle” ng-submit="cmtControle.addComentario(livro)” novalidate> <blockquote>…</blockquote>
 <p>
 <input type="text" ng-model="cmtControle.comentario.autor"
 placeholder="Seu nome” required/>
 </p>
 <p><textarea ng-model=“cmtControle.comentario.texto” placeholder="Deixe seu comentario” required> </textarea>
 </p>
 <input type="submit" value="Adicionar" />
 </form>

  • 71.
    Eduardo Mendes (edumendes@gmail.com) $valid 71 propriedadeform no Angular que indica se o formuário é válido
  • 72.
    Eduardo Mendes (edumendes@gmail.com)72 Desabilitandoa validação padrão 
 <form name=“comentarioForm" ng-controller="ComentarioControle as cmtControle” ng-submit="cmtControle.addComentario(livro)” novalidate> <blockquote>…</blockquote>
 <p>
 <input type="text" ng-model="cmtControle.comentario.autor"
 placeholder="Seu nome” required/>
 </p>
 <p><textarea ng-model=“cmtControle.comentario.texto” placeholder="Deixe seu comentario” required> </textarea>
 </p>
 <input type="submit" value="Adicionar" />
 </form>

  • 73.
    Eduardo Mendes (edumendes@gmail.com)73 Desabilitandoa validação padrão 
 <form name=“comentarioForm" ng-controller="ComentarioControle as cmtControle” ng-submit="cmtControle.addComentario(livro)” novalidate> <blockquote>…</blockquote>
 <p>
 <input type="text" ng-model="cmtControle.comentario.autor"
 placeholder="Seu nome” required/>
 </p>
 <p><textarea ng-model=“cmtControle.comentario.texto” placeholder="Deixe seu comentario” required> </textarea>
 </p> <div>O formulario é ${{comentarioForm.$valid}}</div>
 <input type="submit" value="Adicionar" />
 </form>

  • 74.
    Eduardo Mendes (edumendes@gmail.com)74 Desabilitandoa validação padrão 
 <form name=“comentarioForm" ng-controller="ComentarioControle as cmtControle” ng-submit="cmtControle.addComentario(livro)” novalidate> <blockquote>…</blockquote>
 <p>
 <input type="text" ng-model="cmtControle.comentario.autor"
 placeholder="Seu nome” required/>
 </p>
 <p><textarea ng-model=“cmtControle.comentario.texto” placeholder="Deixe seu comentario” required> </textarea>
 </p> <div>O formulario é ${{comentarioForm.$valid}}</div>
 <input type="submit" value="Adicionar" />
 </form>

  • 75.
    Eduardo Mendes (edumendes@gmail.com)75 Desabilitandoa validação padrão 
 <form name=“comentarioForm" ng-controller="ComentarioControle as cmtControle” ng-submit=“comentarioForm.$valid && cmtControle.addComentario(livro)” novalidate> <blockquote>…</blockquote>
 <p>
 <input type="text" ng-model="cmtControle.comentario.autor"
 placeholder="Seu nome” required/>
 </p>
 <p><textarea ng-model=“cmtControle.comentario.texto” placeholder="Deixe seu comentario” required> </textarea>
 </p> <div>O formulario é ${{comentarioForm.$valid}}</div>
 <input type="submit" value="Adicionar" />
 </form>

  • 76.
    Eduardo Mendes (edumendes@gmail.com)76 Classeno Input pelo Angular <input name="autor“ type="email“ ng-model=“cmtControle.comentario.autor" required/> antes de digitar digitado email inválido digitado email válido .ng-pristine .ng-invalid .ng-dirty .ng-invalid .ng-dirty .ng-valid
  • 77.
    Eduardo Mendes (edumendes@gmail.com)77 CSS .ng-invalid.ng-dirty{
 border-color: darkred;
 }
 
 .ng-invalid.ng-dirty {
 border-color: greenyellow;
 }
  • 78.
  • 79.
  • 80.
  • 81.
    Eduardo Mendes (edumendes@gmail.com)81 Comoreaproveitar código? <h2> {{livro.titulo}} <em class="pull-right">R$ {{livro.preco}}</em> </h2> Poderia aparecer em várias partes na aplicação
  • 82.
    Eduardo Mendes (edumendes@gmail.com)82 Comoreaproveitar código? <h2> {{livro.titulo}} <em class="pull-right">R$ {{livro.preco}}</em> </h2> Criar um arquivo html e reutilizá-lo
  • 83.
    Eduardo Mendes (edumendes@gmail.com)83 Comoreaproveitar código? <h2> {{livro.titulo}} <em class="pull-right">R$ {{livro.preco}}</em> </h2> index.html
  • 84.
    Eduardo Mendes (edumendes@gmail.com)84 Comoreaproveitar código? <h2> </h2> index.html {{livro.titulo}} <em class="pull-right">R$ {{livro.preco}}</em> livro-preco.html
  • 85.
    Eduardo Mendes (edumendes@gmail.com)85 Comoreaproveitar código? <h2 ng-include=“'livro-preco.html'”> </h2> index.html {{livro.titulo}} <em class="pull-right">R$ {{livro.preco}}</em> livro-preco.html
  • 86.
    Eduardo Mendes (edumendes@gmail.com)86 Comoreaproveitar código? <h2 ng-include=“'livro-preco.html'”> </h2> index.html {{livro.titulo}} <em class="pull-right">R$ {{livro.preco}}</em> livro-preco.html Onde está a diretiva???
  • 87.
    Eduardo Mendes (edumendes@gmail.com)87 Comoreaproveitar código? <livro-preco></livro-preco> index.html {{livro.titulo}} <em class="pull-right">R$ {{livro.preco}}</em> livro-preco.html Onde está a diretiva???
  • 88.
    Eduardo Mendes (edumendes@gmail.com)88 Comoreaproveitar código? <livro-preco></livro-preco> app.directive('livroPreco', function() { return { }; }); app.js
  • 89.
    Eduardo Mendes (edumendes@gmail.com)89 Comoreaproveitar código? <livro-preco></livro-preco> app.js app.directive('livroPreco', function() { return { restrict: 'E', templateUrl: 'livro-preco.html' }; }); Diretiva como um elemento
  • 90.
    Eduardo Mendes (edumendes@gmail.com)90 Comoreaproveitar código? <h3 livro-preco></h3> app.js app.directive('livroPreco', function() { return { restrict: 'A', templateUrl: 'livro-preco.html' }; }); Diretiva como um atributo
  • 91.
  • 92.
    Eduardo Mendes (edumendes@gmail.com) Ese o template precisasse
 de um Controller??? 92
  • 93.
    Eduardo Mendes (edumendes@gmail.com)93 Templatedependente de controller <section class="tab" ng-controller="AbasControle as aba"> <ul class="nav nav-pills"> <li><a href ng-click="aba.setAba(1)">Descrição</a></li> <li><a href ng-click="aba.setAba(2)">Comentários</a></li> </ul> <livro-descricao></livro-descricao> <div livro-comentarios></div> </section> index.html
  • 94.
    Eduardo Mendes (edumendes@gmail.com)94 Templatedependente de controller ng-controller="AbasControle as aba" index.html <section class="tab"> <ul class="nav nav-pills"> <li><a href ng-click="aba.setAba(1)">Descrição</a></li> <li><a href ng-click="aba.setAba(2)">Comentários</a></li> </ul> <livro-descricao></livro-descricao> <div livro-comentarios></div> </section> livro-abas.html
  • 95.
    Eduardo Mendes (edumendes@gmail.com)95 Adicionaa diretiva index.html <section class="tab"> <ul class="nav nav-pills"> <li><a href ng-click="aba.setAba(1)">Descrição</a></li> <li><a href ng-click="aba.setAba(2)">Comentários</a></li> </ul> <livro-descricao></livro-descricao> <div livro-comentarios></div> </section> livro-abas.html <livro-abas ng-controller="AbasControle as aba"></livro-abas>
  • 96.
    Eduardo Mendes (edumendes@gmail.com)96 Adicionaa diretiva index.html app.js <livro-abas ng-controller="AbasControle as aba"></livro-abas> app.directive('livroAbas', function() { return { restrict: 'E', templateUrl: 'livro-abas.html' }; });
  • 97.
    Eduardo Mendes (edumendes@gmail.com)97 Adicionaa diretiva index.html app.js <livro-abas ng-controller="AbasControle as aba"></livro-abas> app.directive('livroAbas', function() { return { restrict: 'E', templateUrl: 'livro-abas.html' }; }); app.controller('AbasControle', function() { . . . });
  • 98.
    Eduardo Mendes (edumendes@gmail.com)98 Adicionaa diretiva index.html app.js <livro-abas ng-controller="AbasControle as aba"></livro-abas> app.directive('livroAbas', function() { return { restrict: 'E', templateUrl: ‘livro-abas.html’, controller: function() { . . . } }; });
  • 99.
    Eduardo Mendes (edumendes@gmail.com)99 Adicionaa diretiva index.html app.js <livro-abas ng-controller="AbasControle as aba"></livro-abas> app.directive('livroAbas', function() { return { restrict: 'E', templateUrl: ‘livro-abas.html’, controller: function() { . . . }, controllerAs: ‘aba’ }; });
  • 100.
    Eduardo Mendes (edumendes@gmail.com)100 Adicionaa diretiva index.html app.js <livro-abas></livro-abas> app.directive('livroAbas', function() { return { restrict: 'E', templateUrl: ‘livro-abas.html’, controller: function() { . . . }, controllerAs: ‘aba’ }; });