SlideShare una empresa de Scribd logo
1 de 100
Descargar para leer sin conexión
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’
};
});

Más contenido relacionado

La actualidad más candente

La actualidad más candente (16)

Vb
VbVb
Vb
 
Javascript truquesmagicos
Javascript truquesmagicosJavascript truquesmagicos
Javascript truquesmagicos
 
Programação Web com jQuery
Programação Web com jQueryProgramação Web com jQuery
Programação Web com jQuery
 
Simplificando o full stack - desenvolvimento web na prática
Simplificando o full stack - desenvolvimento web na práticaSimplificando o full stack - desenvolvimento web na prática
Simplificando o full stack - desenvolvimento web na prática
 
O fantástico mundo de Android
O fantástico mundo de AndroidO fantástico mundo de Android
O fantástico mundo de Android
 
jQuery - Visão Geral
jQuery - Visão GeraljQuery - Visão Geral
jQuery - Visão Geral
 
JavaScript ninja com jQuery
JavaScript ninja com jQueryJavaScript ninja com jQuery
JavaScript ninja com jQuery
 
jQuery Simplificando o JavaScript
jQuery Simplificando o JavaScriptjQuery Simplificando o JavaScript
jQuery Simplificando o JavaScript
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com Django
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
Componentes para a Web
Componentes para a WebComponentes para a Web
Componentes para a Web
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDB
 
Aumentando a produtividade com Android Libs
Aumentando a produtividade com Android LibsAumentando a produtividade com Android Libs
Aumentando a produtividade com Android Libs
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEB
 
JavaScript: prototipação, closure e encapsulamento
JavaScript: prototipação, closure e encapsulamentoJavaScript: prototipação, closure e encapsulamento
JavaScript: prototipação, closure e encapsulamento
 
Html dom, eventos, jquery
Html dom, eventos, jqueryHtml dom, eventos, jquery
Html dom, eventos, jquery
 

Destacado (12)

Layout Fluido
Layout FluidoLayout Fluido
Layout Fluido
 
História do Design Impresso
História do Design ImpressoHistória do Design Impresso
História do Design Impresso
 
Mini Curso de Design de Interfaces para Dispositivos Móveis
Mini Curso de Design de Interfaces para Dispositivos MóveisMini Curso de Design de Interfaces para Dispositivos Móveis
Mini Curso de Design de Interfaces para Dispositivos Móveis
 
Aula 03 layout
Aula 03 layoutAula 03 layout
Aula 03 layout
 
Design - Layout
Design - LayoutDesign - Layout
Design - Layout
 
Apresentação Layout
Apresentação LayoutApresentação Layout
Apresentação Layout
 
Processo de design digital
Processo de design digitalProcesso de design digital
Processo de design digital
 
Layout designeditorial-20-b
Layout designeditorial-20-bLayout designeditorial-20-b
Layout designeditorial-20-b
 
Simplificando o design digital
Simplificando o design digitalSimplificando o design digital
Simplificando o design digital
 
Conceitos e princípios de design
Conceitos e princípios de designConceitos e princípios de design
Conceitos e princípios de design
 
Fundamentos design grafico | Insper
Fundamentos design grafico | InsperFundamentos design grafico | Insper
Fundamentos design grafico | Insper
 
Design Editorial | Estruturas
Design Editorial | EstruturasDesign Editorial | Estruturas
Design Editorial | Estruturas
 

Similar a Angular JS - Fundamentos

ODIG - Javascript, DOM Elements e jQuery
ODIG - Javascript, DOM Elements e jQueryODIG - Javascript, DOM Elements e jQuery
ODIG - Javascript, DOM Elements e jQueryMarketing Digital ODIG
 
Backbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosBackbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosHenrique Gogó
 
Backbone.js - A espinha dorsal de aplicações web
Backbone.js - A espinha dorsal de aplicações webBackbone.js - A espinha dorsal de aplicações web
Backbone.js - A espinha dorsal de aplicações webHenrique Gogó
 
Javascript - Biblioteca Jquery
Javascript - Biblioteca JqueryJavascript - Biblioteca Jquery
Javascript - Biblioteca JqueryMultside Digital
 
Workshop Ruby on Rails dia 2 ruby-pt
Workshop Ruby on Rails dia 2  ruby-ptWorkshop Ruby on Rails dia 2  ruby-pt
Workshop Ruby on Rails dia 2 ruby-ptPedro Sousa
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.jsGiovanni Bassi
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Julian Cesar
 
Desenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app engineDesenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app enginepugpe
 
Django + extjs pelos forms
Django + extjs pelos formsDjango + extjs pelos forms
Django + extjs pelos formsMoacir Filho
 
Grails parte 1 - introdução
Grails   parte 1 - introduçãoGrails   parte 1 - introdução
Grails parte 1 - introduçãoJosino Rodrigues
 
JavaScript Model-View no Frontend
JavaScript Model-View no FrontendJavaScript Model-View no Frontend
JavaScript Model-View no FrontendHenrique Gogó
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsEduardo Mendes
 
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.orgBarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.orgjqrd
 

Similar a Angular JS - Fundamentos (20)

J query
J queryJ query
J query
 
ODIG - Javascript, DOM Elements e jQuery
ODIG - Javascript, DOM Elements e jQueryODIG - Javascript, DOM Elements e jQuery
ODIG - Javascript, DOM Elements e jQuery
 
Backbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosBackbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectados
 
Backbone.js - A espinha dorsal de aplicações web
Backbone.js - A espinha dorsal de aplicações webBackbone.js - A espinha dorsal de aplicações web
Backbone.js - A espinha dorsal de aplicações web
 
Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 
Javascript - Biblioteca Jquery
Javascript - Biblioteca JqueryJavascript - Biblioteca Jquery
Javascript - Biblioteca Jquery
 
ApresentaçãO Mvc
ApresentaçãO MvcApresentaçãO Mvc
ApresentaçãO Mvc
 
Apresentação M V C
Apresentação M V CApresentação M V C
Apresentação M V C
 
Workshop Ruby on Rails dia 2 ruby-pt
Workshop Ruby on Rails dia 2  ruby-ptWorkshop Ruby on Rails dia 2  ruby-pt
Workshop Ruby on Rails dia 2 ruby-pt
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.js
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)
 
Desenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app engineDesenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app engine
 
Grails
GrailsGrails
Grails
 
Django + extjs pelos forms
Django + extjs pelos formsDjango + extjs pelos forms
Django + extjs pelos forms
 
Grails parte 1 - introdução
Grails   parte 1 - introduçãoGrails   parte 1 - introdução
Grails parte 1 - introdução
 
Jquery
JqueryJquery
Jquery
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
JavaScript Model-View no Frontend
JavaScript Model-View no FrontendJavaScript Model-View no Frontend
JavaScript Model-View no Frontend
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.orgBarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
 

Más de Eduardo Mendes

Singleton - Padrão de Projeto
Singleton - Padrão de ProjetoSingleton - Padrão de Projeto
Singleton - Padrão de ProjetoEduardo Mendes
 
Introdução à Internet, Http e HTML
Introdução à Internet, Http e HTMLIntrodução à Internet, Http e HTML
Introdução à Internet, Http e HTMLEduardo Mendes
 
Estimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEstimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEduardo Mendes
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Eduardo Mendes
 
Validações no Ruby on Rails
Validações no Ruby on Rails Validações no Ruby on Rails
Validações no Ruby on Rails Eduardo Mendes
 
Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Eduardo Mendes
 
PHP básico para iniciantes
PHP básico para iniciantesPHP básico para iniciantes
PHP básico para iniciantesEduardo Mendes
 
PHP e MySQL para iniciantes
PHP e MySQL para iniciantesPHP e MySQL para iniciantes
PHP e MySQL para iniciantesEduardo Mendes
 
Introdução a Padrões de Projeto
Introdução a Padrões de ProjetoIntrodução a Padrões de Projeto
Introdução a Padrões de ProjetoEduardo Mendes
 
Strategy - Padrões de Projeto
Strategy - Padrões de ProjetoStrategy - Padrões de Projeto
Strategy - Padrões de ProjetoEduardo Mendes
 
Decorator - Padrões de projeto
Decorator - Padrões de projetoDecorator - Padrões de projeto
Decorator - Padrões de projetoEduardo Mendes
 
Observer - Padrões de projeto
Observer - Padrões de projetoObserver - Padrões de projeto
Observer - Padrões de projetoEduardo Mendes
 

Más de Eduardo Mendes (20)

Singleton - Padrão de Projeto
Singleton - Padrão de ProjetoSingleton - Padrão de Projeto
Singleton - Padrão de Projeto
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
 
Html - Aula 4
Html - Aula 4Html - Aula 4
Html - Aula 4
 
Html - Aula 3
Html - Aula 3Html - Aula 3
Html - Aula 3
 
Introdução à Internet, Http e HTML
Introdução à Internet, Http e HTMLIntrodução à Internet, Http e HTML
Introdução à Internet, Http e HTML
 
Estimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEstimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de Software
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2
 
Validações no Ruby on Rails
Validações no Ruby on Rails Validações no Ruby on Rails
Validações no Ruby on Rails
 
Padrão Iterator
Padrão IteratorPadrão Iterator
Padrão Iterator
 
Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)
 
Padrão Command
Padrão CommandPadrão Command
Padrão Command
 
Padrão Fachada
Padrão FachadaPadrão Fachada
Padrão Fachada
 
Padrão Adapter
Padrão AdapterPadrão Adapter
Padrão Adapter
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
 
PHP básico para iniciantes
PHP básico para iniciantesPHP básico para iniciantes
PHP básico para iniciantes
 
PHP e MySQL para iniciantes
PHP e MySQL para iniciantesPHP e MySQL para iniciantes
PHP e MySQL para iniciantes
 
Introdução a Padrões de Projeto
Introdução a Padrões de ProjetoIntrodução a Padrões de Projeto
Introdução a Padrões de Projeto
 
Strategy - Padrões de Projeto
Strategy - Padrões de ProjetoStrategy - Padrões de Projeto
Strategy - Padrões de Projeto
 
Decorator - Padrões de projeto
Decorator - Padrões de projetoDecorator - Padrões de projeto
Decorator - Padrões de projeto
 
Observer - Padrões de projeto
Observer - Padrões de projetoObserver - Padrões de projeto
Observer - Padrões de projeto
 

Angular JS - Fundamentos

  • 1. Eduardo Mendes de Oliveira edumendes@gmail.com
  • 3. 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
  • 6. 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
  • 8. 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"); }
  • 9. Eduardo Mendes (edumendes@gmail.com)9 Directives <!DOCTYPE html> <html> <body > ... </body> </html> function HelloAngular() { alert("Hello from Angular, World"); }ng-controller="HelloAngular"
  • 11. 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>
  • 12. 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>
  • 14. 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
  • 15. Eduardo Mendes (edumendes@gmail.com)15 Criando o primeiro Módulo var app = angular.module('livraria', [ ]); AngularJS Nome da Aplicação Dependências
  • 16. 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>
  • 17. 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"
  • 19. 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>
  • 21. Eduardo Mendes (edumendes@gmail.com)21 Utilizando dados var livro = { titulo: 'O Senhor dos Aneis', preco: 40.0, descricao: ‘Descricao 1' } Objeto JS
  • 22. 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' }
  • 23. 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
  • 24. 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>
  • 25. 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"
  • 26. 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>
  • 28. Eduardo Mendes (edumendes@gmail.com)28 Exibição de um botão condicionado a existir quantidade em estoque
  • 30. Eduardo Mendes (edumendes@gmail.com)30 Adequando os dados à necessidade var livro = { titulo: 'O Senhor dos Aneis', preco: 40.0, descricao: ‘Descricao 1' }
  • 31. 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
  • 32. 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>
  • 33. 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 }
  • 34. 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
  • 36. 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
  • 37. 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
  • 38. 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”>
  • 39. Eduardo Mendes (edumendes@gmail.com)39 Utilizando Abas 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 permite especificar um comportamento personalizado quando um elemento é clicado
  • 42. 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(?)
  • 43. 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>
  • 44. 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>
  • 47. 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
  • 48. 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>
  • 49. 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>
  • 50. 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>
  • 51. 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>
  • 52. Eduardo Mendes (edumendes@gmail.com) Diretiva
 ng-model 52 vincula o valor de um input, select, textarea a uma propriedade
  • 53. 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>
  • 54. 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>
  • 56. Eduardo Mendes (edumendes@gmail.com)56 Forms Controlador propriedade • comentario comportamentos • addComentario(livro)
  • 58. 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>
  • 59. 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>

  • 60. 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>

  • 61. Eduardo Mendes (edumendes@gmail.com) Diretiva
 ng-submit 61 permite vincular comportamentos a um evento onsubmit
  • 62. 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>

  • 63. 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>

  • 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 = {}; }; });
  • 68. 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>

  • 69. 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>

  • 70. 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>

  • 71. Eduardo Mendes (edumendes@gmail.com) $valid 71 propriedade form no Angular que indica se o formuário é válido
  • 72. 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>

  • 73. 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>

  • 74. 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>

  • 75. 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>

  • 76. 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
  • 77. Eduardo Mendes (edumendes@gmail.com)77 CSS .ng-invalid.ng-dirty {
 border-color: darkred;
 }
 
 .ng-invalid.ng-dirty {
 border-color: greenyellow;
 }
  • 81. 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
  • 82. 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
  • 83. Eduardo Mendes (edumendes@gmail.com)83 Como reaproveitar código? <h2> {{livro.titulo}} <em class="pull-right">R$ {{livro.preco}}</em> </h2> index.html
  • 84. 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
  • 85. 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
  • 86. 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???
  • 87. 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???
  • 88. Eduardo Mendes (edumendes@gmail.com)88 Como reaproveitar código? <livro-preco></livro-preco> app.directive('livroPreco', function() { return { }; }); app.js
  • 89. 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
  • 90. 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
  • 92. Eduardo Mendes (edumendes@gmail.com) E se o template precisasse
 de um Controller??? 92
  • 93. 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
  • 94. 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
  • 95. 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>
  • 96. 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' }; });
  • 97. 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() { . . . });
  • 98. 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() { . . . } }; });
  • 99. 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’ }; });
  • 100. 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’ }; });