SlideShare uma empresa Scribd logo
Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br
Criando Diretivas
com AngularJS
“Transformar equipes de desenvolvimento de software”
http://www.agilecode.com.br
Rodrigo Branas
rodrigo.branas@agilecode.com.br
http://www.agilecode.com.br
• Desenvolvendo Software na Gennera
• Criando treinamentos na Agile Code
• Escrevendo na Java Magazine e PacktPub
• Palestrando sobre desenvolvimento de
software em eventos, universidades e
empresas
Certificações
Formação Acadêmica
Ciências da Computação – UFSC
Gerenciamento de Projetos - FGV
SCJA, SCJP, SCJD, SCWCD, SCBCD, PMP, MCP e CSM
Experiência
Há mais de 12 anos desenvolvendo software na
plataforma Java com as empresas: EDS, HP, NET,
Citibank, GM, Dígitro, Softplan, OnCast, Senai,
VALE, RBS, Unimed, Globalcode, V.Office, Suntech,
WPlex e Gennera.
• Há mais de 5 anos liderando pessoas.
• Mais de 2000 horas em sala de aula.
• Mais de 100 apresentações em eventos.
• 6 artigos escritos para revistas.
• 1 livro.
• Mais de 500 profissionais treinados.
• Criação de 22 palestras.
• Criação de 10 treinamentos.
• Criação de mais de 3.000 slides.
O que realmente me motiva?
Como criar uma diretiva?
1. app.directive("nomeDaDiretiva", function () {
2. });
Registrando a diretiva no módulo
1. app.directive("nomeDaDiretiva", function () {
2. return {
3. };
4. });
Criando o Directive Definition Object
1. app.directive("nomeDaDiretiva", function () {
2. return {
3. // Propriedades da Diretiva
4. };
5. });
Adicionando propriedades ao Directive
Definition Object
Por dentro das propriedades para criação de
diretivas básicas
• template
• templateUrl
• replace
• restrict
• scope
• transclude
Construindo Diretivas com AngularJS
1. <html ng-app="listaTelefonica">
2. <head>
3. <script src='angular.js'></script>
4. <script>
5. var app = angular.module("listaTelefonica", []);
6. app.controller("listaTelefonicaCtrl", function ($scope) {
7. $scope.mensagem = "Por favor, preencha o campo nome e telefone";
8. });
9. </script>
10. </head>
11. <body ng-controller="listaTelefonicaCtrl">
12. <div class="alert">
13. <div class='alert-topic'>Ops, um problema aconteceu!</div>
14. <div class='alert-description'>{{mensagem}}</div>
15. </div>
16. </body>
17. </html>
template / templateUrl
Especifica o template ou a url do template
que deverá ser incluído dentro do elemento
que estiver utilizando a diretiva.
1. <html ng-app="listaTelefonica">
2. <head>
3. <script src='angular.js'></script>
4. <script>
5. var app = angular.module("listaTelefonica", []);
6. app.controller("listaTelefonicaCtrl", function ($scope) {
7. $scope.mensagem = "Por favor, preencha o campo nome e telefone";
8. });
9. </script>
10. </head>
11. <body ng-controller="listaTelefonicaCtrl">
12. <div class="alert">
13. <div class='alert-topic'>Ops, um problema aconteceu!</div>
14. <div class='alert-description'>{{mensagem}}</div>
15. </div>
16. </body>
17. </html>
1. <html ng-app="listaTelefonica">
2. <head>
3. <script src='angular.js'></script>
4. <script>
5. var app = angular.module("listaTelefonica", []);
6. app.controller("listaTelefonicaCtrl", function ($scope) {
7. $scope.mensagem = "Por favor, preencha o campo nome e telefone";
8. });
9. </script>
10. </head>
11. <body ng-controller="listaTelefonicaCtrl">
12. <div class="alert">
13. <div class='alert-topic'>Ops, um problema aconteceu!</div>
14. <div class='alert-description'>{{mensagem}}</div>
15. </div>
16. </body>
17. </html>
1. <html ng-app="listaTelefonica">
2. <head>
3. <script src='angular.js'></script>
4. <script>
5. var app = angular.module("listaTelefonica", []);
6. app.controller("listaTelefonicaCtrl", function ($scope) {
7. $scope.mensagem = "Por favor, preencha o campo nome e telefone";
8. });
9. </script>
10. </head>
11. <body ng-controller="listaTelefonicaCtrl">
12. </body>
13. </html>
1. <html ng-app="listaTelefonica">
2. <head>
3. <script src='angular.js'></script>
4. <script>
5. var app = angular.module("listaTelefonica", []);
6. app.controller("listaTelefonicaCtrl", function ($scope) {
7. $scope.mensagem = "Por favor, preencha o campo nome e telefone";
8. });
9. </script>
10. </head>
11. <body ng-controller="listaTelefonicaCtrl">
12. <div alert></div>
13. </body>
14. </html>
1. <div alert></div>
Diretiva antes da compilação
1. app.directive("alert", function () {
2. return {
3. };
4. });
1. app.directive("alert", function () {
2. return {
3. template:
4. };
5. });
1. app.directive("alert", function () {
2. return {
3. template:
4. "<div class='alert'>" +
5. "<div class='alert-topic'>Ops, um problema aconteceu!</div>" +
6. "<div class='alert-description'>{{mensagem}}</div>" +
7. "</div>"
8. };
9. });
1. app.directive("alert", function () {
2. return {
3. template:
4. "<div class='alert'>" +
5. "<div class='alert-topic'>Ops, um problema aconteceu!</div>" +
6. "<div class='alert-description'>{{mensagem}}</div>" +
7. "</div>"
8. };
9. });
1. app.directive("alert", function () {
2. return {
3. };
4. });
1. app.directive("alert", function () {
2. return {
3. templateUrl: "alert.html"
4. };
5. });
1. app.directive("alert", function () {
2. return {
3. templateUrl: "alert.html"
4. };
5. });
1. <div alert="">
2. <div class="alert">
3. <div class="alert-topic">Ops, um problema aconteceu!</div>
4. <div class="alert-description">Por favor, preencha o campo nome e telefone</div>
5. </div>
6. </div>
Diretiva depois da compilação
replace
Substitui o elemento pelo conteúdo do
template.
1. <div alert="">
2. <div class="alert">
3. <div class="alert-topic">Ops, um problema aconteceu!</div>
4. <div class="alert-description">Por favor, preencha o campo nome e telefone</div>
5. </div>
6. </div>
Diretiva depois da compilação
1. <div alert="">
2. <div class="alert">
3. <div class="alert-topic">Ops, um problema aconteceu!</div>
4. <div class="alert-description">Por favor, preencha o campo nome e telefone</div>
5. </div>
6. </div>
Diretiva depois da compilação
1. app.directive("alert", function () {
2. return {
3. templateUrl: "alert.html"
4. };
5. });
1. app.directive("alert", function () {
2. return {
3. templateUrl: "alert.html",
4. replace: true
5. };
6. });
1. <div alert="">
2. <div class="alert">
3. <div class="alert-topic">Ops, um problema aconteceu!</div>
4. <div class="alert-description">Por favor, preencha o campo nome e telefone</div>
5. </div>
6. </div>
Diretiva depois da compilação
1. <div class="alert">
2. <div class="alert-topic">Ops, um problema aconteceu!</div>
3. <div class="alert-description">Por favor, preencha o campo nome e telefone</div>
4. </div>
Diretiva depois da compilação
restrict
Restringe o modo de utilização da diretiva
ao atributo, elemento, classe e comentário,
ou ainda uma combinação deles.
Caso não seja definido, o padrão é que a
diretiva seja atribuída pelo atributo.
Tipos de restrição
A - Diretiva restrita ao atributo do elemento
E - Diretiva restrita ao elemento
C - Diretiva restrita a classe do elemento
M - Diretiva restrita ao comentário do elemento
1. <div alert></div>
Diretiva restrita ao atributo do elemento
1. app.directive("alert", function () {
2. return {
3. templateUrl: "alert.html",
4. replace: true,
5. restrict: "A"
6. };
7. });
1. <alert></alert>
Diretiva restrita ao elemento
1. app.directive("alert", function () {
2. return {
3. templateUrl: "alert.html",
4. replace: true,
5. restrict: "E"
6. };
7. });
1. <div class="alert"></div>
Diretiva restrita a classe do elemento
1. app.directive("alert", function () {
2. return {
3. templateUrl: "alert.html",
4. replace: true,
5. restrict: "C"
6. };
7. });
1. <!-- directive: alert-->
2. <div></div>
Diretiva restrita ao comentário do elemento
1. app.directive("alert", function () {
2. return {
3. templateUrl: "alert.html",
4. replace: true,
5. restrict: "M"
6. };
7. });
scope
Por padrão, uma diretiva compartilha o
mesmo scope de onde é utilizada.
Para aumentar seu potencial de reuso,
podemos isolar seu scope, passando os
dados necessário por parâmetro.
@
Vincula um atributo a uma
propriedade do scope da diretiva
1. <alert></alert>
1. <alert>
2. </alert>
1. <alert message="Por favor, preencha o campo nome e telefone">
2. </alert>
1. app.directive("alert", function () {
2. return {
3. templateUrl: "alert.html",
4. replace: true,
5. restrict: "E"
6. };
7. });
1. app.directive("alert", function () {
2. return {
3. templateUrl: "alert.html",
4. replace: true,
5. restrict: "E",
6. scope: {
7. }
8. };
9. });
1. app.directive("alert", function () {
2. return {
3. templateUrl: "alert.html",
4. replace: true,
5. restrict: "E",
6. scope: {
7. message: "@message"
8. }
9. };
10. });
1. app.directive("alert", function () {
2. return {
3. templateUrl: "alert.html",
4. replace: true,
5. restrict: "E",
6. scope: {
7. message: "@"
8. }
9. };
10. });
=
Cria um vínculo bi-direcional entre
uma propriedade do scope do
template a uma propriedade do
scope da diretiva
1. <alert message="Por favor, preencha o campo nome e telefone">
2. </alert>
1. <alert message="">
2. </alert>
1. <alert message="mensagem">
2. </alert>
1. app.directive("alert", function () {
2. return {
3. templateUrl: "alert.html",
4. replace: true,
5. restrict: "E",
6. scope: {
7. message: "=message"
8. }
9. };
10. });
1. app.directive("alert", function () {
2. return {
3. templateUrl: "alert.html",
4. replace: true,
5. restrict: "E",
6. scope: {
7. message: "="
8. }
9. };
10. });
transclude
É possível encapsular elementos dentro de
uma diretiva.
1. <alert>
2. </alert>
1. <alert>
2. Por favor, preencha o campo nome e telefone
3. </alert>
1. app.directive("alert", function () {
2. return {
3. templateUrl: "alert.html",
4. replace: true,
5. restrict: "E",
6. transclude: true
7. };
8. });
1. <div class="alert">
2. <div class="alert-topic">Ops, um problema aconteceu!</div>
3. <div class="alert-description" ng-transclude></div>
4. </div>
alert.html
1. <div class="alert">
2. <div class="alert-topic">Ops, um problema aconteceu!</div>
3. <div class="alert-description" ng-transclude>
4. Por favor, preencha o campo nome e telefone
5. </div>
6. </div>
Diretiva depois da compilação
Por dentro das propriedades das diretivas
para criação de diretivas avançadas
• link
• require
• controller
• compile
link
Por meio da função link, podemos interagir
com a DOM, vinculando eventos ou mesmo
executar um procedimento de inicialização
da diretiva.
Construindo Diretivas com AngularJS
Construindo Diretivas com AngularJS
Construindo Diretivas com AngularJS
Construindo Diretivas com AngularJS
1. <accordion-item title="Rodrigo Branas">
2. </accordion-item>
3. <accordion-item title="João da Silva">
4. </accordion-item>
5. <accordion-item title="Pedro Cavalcante">
6. </accordion-item>
1. <accordion-item title="Rodrigo Branas">
2. Agile Code</br>
3. rodrigo.branas@agilecode.com.br</br>
4. http://www.agilecode.com.br</br>
5. </accordion-item>
6. <accordion-item title="João da Silva">
7. </accordion-item>
8. <accordion-item title="Pedro Cavalcante">
9. </accordion-item>
1. <accordion-item title="Rodrigo Branas">
2. Agile Code</br>
3. rodrigo.branas@agilecode.com.br</br>
4. http://www.agilecode.com.br</br>
5. </accordion-item>
6. <accordion-item title="João da Silva">
7. Google</br>
8. joao.silva@google.com</br>
9. http://www.google.com</br>
10. </accordion-item>
11. <accordion-item title="Pedro Cavalcante">
12. </accordion-item>
1. <accordion-item title="Rodrigo Branas">
2. Agile Code</br>
3. rodrigo.branas@agilecode.com.br</br>
4. http://www.agilecode.com.br</br>
5. </accordion-item>
6. <accordion-item title="João da Silva">
7. Google</br>
8. joao.silva@google.com</br>
9. http://www.google.com</br>
10. </accordion-item>
11. <accordion-item title="Pedro Cavalcante">
12. Microsoft</br>
13. pedro.cavalcante@microsoft.com</br>
14. http://www.microsoft.com</br>
15. </accordion-item>
1. app.directive("accordionItem", function () {
2. return {
3. templateUrl: "accordion-item.html",
4. restrict: "E",
5. transclude: true,
6. replace: true,
7. scope: {
8. title: "@"
9. }
10. };
11. });
Parâmetros da função link
• scope
• element
• attrs
• controller
• transclude
1. app.directive("accordionItem", function () {
2. return {
3. templateUrl: "accordion-item.html",
4. restrict: "E",
5. transclude: true,
6. replace: true,
7. scope: {
8. title: "@"
9. }
10. };
11. });
1. app.directive("accordionItem", function () {
2. return {
3. templateUrl: "accordion-item.html",
4. restrict: "E",
5. transclude: true,
6. replace: true,
7. scope: {
8. title: "@"
9. },
10. link: function (scope, element, attrs, ctrl, transcludeFn) {
11. }
12. };
13. });
1. app.directive("accordionItem", function () {
2. return {
3. templateUrl: "accordion-item.html",
4. restrict: "E",
5. transclude: true,
6. replace: true,
7. scope: {
8. title: "@"
9. },
10. link: function (scope, element, attrs, ctrl, transcludeFn) {
11. element.bind("click", function () {
12. });
13. }
14. };
15. });
1. app.directive("accordionItem", function () {
2. return {
3. templateUrl: "accordion-item.html",
4. restrict: "E",
5. transclude: true,
6. replace: true,
7. scope: {
8. title: "@"
9. },
10. link: function (scope, element, attrs, ctrl, transcludeFn) {
11. element.bind("click", function () {
12. scope.$apply(function () {
13. scope.showDescription = !scope.showDescription;
14. });
15. });
16. }
17. };
18. });
1. <div>
2. <div class='accordion-topic'>{{title}}</div>
3. <div class='accordion-description' ng-show='showDescription' ng-transclude>
4. </div>
5. </div>
accordion-item.html
require
Cria um vínculo com outra diretiva,
recebendo seu controller como parâmetro
na função link.
Construindo Diretivas com AngularJS
Construindo Diretivas com AngularJS
Construindo Diretivas com AngularJS
Construindo Diretivas com AngularJS
1. <accordion-item title="Rodrigo Branas">
2. Agile Code</br>
3. rodrigo.branas@agilecode.com.br</br>
4. http://www.agilecode.com.br</br>
5. </accordion-item>
6. <accordion-item title="João da Silva">
7. Google</br>
8. joao.silva@google.com</br>
9. http://www.google.com</br>
10. </accordion-item>
11. <accordion-item title="Pedro Cavalcante">
12. Microsoft</br>
13. pedro.cavalcante@microsoft.com</br>
14. http://www.microsoft.com</br>
15. </accordion-item>
1. <accordion>
2. <accordion-item title="Rodrigo Branas">
3. Agile Code</br>
4. rodrigo.branas@agilecode.com.br</br>
5. http://www.agilecode.com.br</br>
6. </accordion-item>
7. <accordion-item title="João da Silva">
8. Google</br>
9. joao.silva@google.com</br>
10. http://www.google.com</br>
11. </accordion-item>
12. <accordion-item title="Pedro Cavalcante">
13. Microsoft</br>
14. pedro.cavalcante@microsoft.com</br>
15. http://www.microsoft.com</br>
16. </accordion-item>
17. </accordion>
1. <accordion>
2. <accordion-item title="Rodrigo Branas">
3. Agile Code</br>
4. rodrigo.branas@agilecode.com.br</br>
5. http://www.agilecode.com.br</br>
6. </accordion-item>
7. <accordion-item title="João da Silva">
8. Google</br>
9. joao.silva@google.com</br>
10. http://www.google.com</br>
11. </accordion-item>
12. <accordion-item title="Pedro Cavalcante">
13. Microsoft</br>
14. pedro.cavalcante@microsoft.com</br>
15. http://www.microsoft.com</br>
16. </accordion-item>
17. </accordion>
1. app.directive("accordionItem", function () {
2. return {
3. templateUrl: "accordion-item.html",
4. restrict: "E",
5. transclude: true,
6. replace: true,
7. scope: {
8. title: "@"
9. },
10. link: function (scope, element, attrs, ctrl, transcludeFn) {
11. element.bind("click", function () {
12. scope.$apply(function () {
13. scope.showDescription = !scope.showDescription;
14. });
15. });
16. }
17. };
18. });
1. app.directive("accordionItem", function () {
2. return {
3. templateUrl: "accordion-item.html",
4. restrict: "E",
5. transclude: true,
6. replace: true,
7. scope: {
8. title: "@"
9. },
10. require: "^accordion",
11. link: function (scope, element, attrs, ctrl, transcludeFn) {
12. element.bind("click", function () {
13. scope.$apply(function () {
14. scope.showDescription = !scope.showDescription;
15. });
16. });
17. }
18. };
19. });
1. app.directive("accordionItem", function () {
2. return {
3. templateUrl: "accordion-item.html",
4. restrict: "E",
5. transclude: true,
6. replace: true,
7. scope: {
8. title: "@"
9. },
10. require: "^accordion",
11. link: function (scope, element, attrs, ctrl, transcludeFn) {
12. element.bind("click", function () {
13. scope.$apply(function () {
14. scope.showDescription = !scope.showDescription;
15. });
16. });
17. }
18. };
19. });
1. app.directive("accordionItem", function () {
2. return {
3. templateUrl: "accordion-item.html",
4. restrict: "E",
5. transclude: true,
6. replace: true,
7. scope: {
8. title: "@"
9. },
10. require: "^accordion",
11. link: function (scope, element, attrs, ctrl, transcludeFn) {
12. element.bind("click", function () {
13. ctrl.closeAllAccordionItens();
14. scope.$apply(function () {
15. scope.showDescription = !scope.showDescription;
16. });
17. });
18. }
19. };
20. });
1. app.directive("accordionItem", function () {
2. return {
3. templateUrl: "accordion-item.html",
4. restrict: "E",
5. transclude: true,
6. replace: true,
7. scope: {
8. title: "@"
9. },
10. require: "^accordion",
11. link: function (scope, element, attrs, ctrl, transcludeFn) {
12. element.bind("click", function () {
13. ctrl.closeAllAccordionItens();
14. scope.$apply(function () {
15. scope.showDescription = !scope.showDescription;
16. });
17. });
18. }
19. };
20. });
1. app.directive("accordionItem", function () {
2. return {
3. templateUrl: "accordion-item.html",
4. restrict: "E",
5. transclude: true,
6. replace: true,
7. scope: {
8. title: "@"
9. },
10. require: "^accordion",
11. link: function (scope, element, attrs, ctrl, transcludeFn) {
12. ctrl.addAccordionItemScope(scope);
13. element.bind("click", function () {
14. ctrl.closeAllAccordionItens();
15. scope.$apply(function () {
16. scope.showDescription = !scope.showDescription;
17. });
18. });
19. }
20. };
21. });
1. app.directive("accordionItem", function () {
2. return {
3. templateUrl: "accordion-item.html",
4. restrict: "E",
5. transclude: true,
6. replace: true,
7. scope: {
8. title: "@"
9. },
10. require: "^accordion",
11. link: function (scope, element, attrs, ctrl, transcludeFn) {
12. ctrl.addAccordionItemScope(scope);
13. element.bind("click", function () {
14. ctrl.closeAllAccordionItens();
15. scope.$apply(function () {
16. scope.showDescription = !scope.showDescription;
17. });
18. });
19. }
20. };
21. });
controller
Permite a criação e o compartilhamento de
comportamento com outras diretivas.
1. app.directive("accordion", function () {
2. return {
3. template: "<div ng-transclude></div>",
4. restrict: "E",
5. transclude: true,
6. replace: true,
7. controller: function ($scope, $element, $attrs) {
8. var itensScope = [];
9.
10. var addAccordionItemScope = function (scope) {
11. itensScope.push(scope);
12. };
13.
14. var closeAllAccordionItens = function () {
15. angular.forEach(itensScope, function (scope) {
16. scope.showItem = false;
17. });
18. };
19.
20. return {
21. addAccordionItemScope: addAccordionItemScope,
22. closeAllAccordionItens: closeAllAccordionItens
23. };
24. }
25. };
26. });

Mais conteúdo relacionado

PPTX
Dart presentation
PPTX
Table and Form HTML&CSS
PPTX
Introdução ao AngularJS
PPT
Javascript
PDF
jQuery for beginners
PPTX
Desvendando a linguagem JavaScript
PPTX
Typescript ppt
PDF
JavaScript Tutorial For Beginners | JavaScript Training | JavaScript Programm...
Dart presentation
Table and Form HTML&CSS
Introdução ao AngularJS
Javascript
jQuery for beginners
Desvendando a linguagem JavaScript
Typescript ppt
JavaScript Tutorial For Beginners | JavaScript Training | JavaScript Programm...

Mais procurados (20)

PPTX
React js
PPT
JavaScript Tutorial
PPTX
jQuery
PPT
Aula javascript
PPTX
presentation in html,css,javascript
PDF
DOMinando JavaScript
PPTX
Bootstrap PPT by Mukesh
PPTX
Express js
PPT
Class 5 - PHP Strings
PPTX
Introdução básica ao JavaScript
PPTX
TypeScript intro
PPTX
Flutter session 01
PPTX
Dart programming language
PDF
HTTP Interceptors com AngularJS
PDF
4. Programación con arrays, funciones, y objetos definidos por el usuario
PPTX
Introduction to flutter(1)
PPT
Css Ppt
PPT
Php Presentation
PDF
JavaScript - Chapter 10 - Strings and Arrays
PPTX
Java script
React js
JavaScript Tutorial
jQuery
Aula javascript
presentation in html,css,javascript
DOMinando JavaScript
Bootstrap PPT by Mukesh
Express js
Class 5 - PHP Strings
Introdução básica ao JavaScript
TypeScript intro
Flutter session 01
Dart programming language
HTTP Interceptors com AngularJS
4. Programación con arrays, funciones, y objetos definidos por el usuario
Introduction to flutter(1)
Css Ppt
Php Presentation
JavaScript - Chapter 10 - Strings and Arrays
Java script
Anúncio

Destaque (20)

PDF
The New Age Business Analyst - Role of BA in the Changing times of Agile Soft...
PPTX
Utilizando diretivas com AngularJS
PPTX
A evolução do AngularJS
PPTX
AngularJS - 10 passos para aprender a criar suas directivas
PDF
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
PPTX
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
PDF
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
PDF
Node.js - #5 - Process - Rodrigo Branas
PPTX
Validando Formulários com AngularJS
PPTX
Selenium - WebDriver
PDF
Node.js - #6 - Core Modules - net - Rodrigo Branas
PPTX
Criando Filtros com AngularJS
PPTX
JavaScript - Expressões Regulares
PDF
Cloud computing
PPT
Introdução ao Apache Camel: Padrões de Integração
PPTX
Autocomplete con AngularJs
PDF
Criando um componente de busca com AngularJS
PPTX
Porque eu deveria utilizar Agile
PPTX
AngularJS: Service, factory & provider
PDF
E-trânsito cidadão - IPVA em suas mãos
The New Age Business Analyst - Role of BA in the Changing times of Agile Soft...
Utilizando diretivas com AngularJS
A evolução do AngularJS
AngularJS - 10 passos para aprender a criar suas directivas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #5 - Process - Rodrigo Branas
Validando Formulários com AngularJS
Selenium - WebDriver
Node.js - #6 - Core Modules - net - Rodrigo Branas
Criando Filtros com AngularJS
JavaScript - Expressões Regulares
Cloud computing
Introdução ao Apache Camel: Padrões de Integração
Autocomplete con AngularJs
Criando um componente de busca com AngularJS
Porque eu deveria utilizar Agile
AngularJS: Service, factory & provider
E-trânsito cidadão - IPVA em suas mãos
Anúncio

Semelhante a Construindo Diretivas com AngularJS (20)

PPTX
Automação de Testes com AngularJS
PDF
Programando para programadores: Desafios na evolução de um Framework
PDF
Javascript truquesmagicos
PPTX
HTTP, JSON, REST e AJAX com AngularJS
PDF
JavaScript e JQuery para Webdesigners
PDF
Java e Cloud Computing
PDF
JSF 2.0 e ScrumToys
PDF
Aplicacoes Rapidas Para Web Com Django
PPTX
Scope AngularJS
PPTX
Criando aplicações Single-Page com AngularJS
PDF
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
PDF
Phonegap - Framework Mobile
PDF
Spring MVC Framework
PDF
JSF 2.0: Uma Evolução nas Interfaces Web com Java
PPTX
Técnicas de Refactoring
PDF
JSF 2.0 e ScrumToys
PDF
O que esperar do Zend Framework 3
PDF
Desenvolvendo aplicacoes mobile_com_html_css_
PDF
Ambiente de Desenvolvimento Java usando Ant
PDF
Analise frameworks php
Automação de Testes com AngularJS
Programando para programadores: Desafios na evolução de um Framework
Javascript truquesmagicos
HTTP, JSON, REST e AJAX com AngularJS
JavaScript e JQuery para Webdesigners
Java e Cloud Computing
JSF 2.0 e ScrumToys
Aplicacoes Rapidas Para Web Com Django
Scope AngularJS
Criando aplicações Single-Page com AngularJS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
Phonegap - Framework Mobile
Spring MVC Framework
JSF 2.0: Uma Evolução nas Interfaces Web com Java
Técnicas de Refactoring
JSF 2.0 e ScrumToys
O que esperar do Zend Framework 3
Desenvolvendo aplicacoes mobile_com_html_css_
Ambiente de Desenvolvimento Java usando Ant
Analise frameworks php

Mais de Rodrigo Branas (15)

PDF
Clean Architecture
PDF
Node.js - #4 - Timers - Rodrigo Branas
PDF
Node.js - #3 - Global Objects - Rodrigo Branas
PDF
Node.js - #1 - Introdução - Rodrigo Branas
PDF
#6 - Git - Desfazendo as coisas
PDF
#1 - Git - Introdução
PDF
#5 - Git - Contribuindo com um repositório remoto
PDF
#4 - Git - Stash
PDF
#3 - Git - Branching e Merging
PDF
#2 - Git - DAG
PPTX
JavaScript - Date
PPTX
Criando serviços com AngularJS
PPTX
Test-Driven Development com JavaScript, Jasmine Karma
PPTX
PPTX
Clean Architecture
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo Branas
#6 - Git - Desfazendo as coisas
#1 - Git - Introdução
#5 - Git - Contribuindo com um repositório remoto
#4 - Git - Stash
#3 - Git - Branching e Merging
#2 - Git - DAG
JavaScript - Date
Criando serviços com AngularJS
Test-Driven Development com JavaScript, Jasmine Karma

Último (8)

PPTX
Arquitetura de computadores - Memórias Secundárias
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Manejo integrado de pragas na cultura do algodão
PPTX
Mecânico de Manutenção de Equipamentos.pptx
PPTX
Viasol Energia Solar -Soluções para geração e economia de energia
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Arquitetura de computadores - Memórias Secundárias
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Manejo integrado de pragas na cultura do algodão
Mecânico de Manutenção de Equipamentos.pptx
Viasol Energia Solar -Soluções para geração e economia de energia
Termos utilizados na designação de relação entre pessoa e uma obra.pdf

Construindo Diretivas com AngularJS

  • 1. Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br Criando Diretivas com AngularJS
  • 2. “Transformar equipes de desenvolvimento de software” http://www.agilecode.com.br
  • 3. Rodrigo Branas [email protected] http://www.agilecode.com.br • Desenvolvendo Software na Gennera • Criando treinamentos na Agile Code • Escrevendo na Java Magazine e PacktPub • Palestrando sobre desenvolvimento de software em eventos, universidades e empresas
  • 4. Certificações Formação Acadêmica Ciências da Computação – UFSC Gerenciamento de Projetos - FGV SCJA, SCJP, SCJD, SCWCD, SCBCD, PMP, MCP e CSM Experiência Há mais de 12 anos desenvolvendo software na plataforma Java com as empresas: EDS, HP, NET, Citibank, GM, Dígitro, Softplan, OnCast, Senai, VALE, RBS, Unimed, Globalcode, V.Office, Suntech, WPlex e Gennera.
  • 5. • Há mais de 5 anos liderando pessoas. • Mais de 2000 horas em sala de aula. • Mais de 100 apresentações em eventos. • 6 artigos escritos para revistas. • 1 livro. • Mais de 500 profissionais treinados. • Criação de 22 palestras. • Criação de 10 treinamentos. • Criação de mais de 3.000 slides. O que realmente me motiva?
  • 6. Como criar uma diretiva?
  • 7. 1. app.directive("nomeDaDiretiva", function () { 2. }); Registrando a diretiva no módulo
  • 8. 1. app.directive("nomeDaDiretiva", function () { 2. return { 3. }; 4. }); Criando o Directive Definition Object
  • 9. 1. app.directive("nomeDaDiretiva", function () { 2. return { 3. // Propriedades da Diretiva 4. }; 5. }); Adicionando propriedades ao Directive Definition Object
  • 10. Por dentro das propriedades para criação de diretivas básicas • template • templateUrl • replace • restrict • scope • transclude
  • 12. 1. <html ng-app="listaTelefonica"> 2. <head> 3. <script src='angular.js'></script> 4. <script> 5. var app = angular.module("listaTelefonica", []); 6. app.controller("listaTelefonicaCtrl", function ($scope) { 7. $scope.mensagem = "Por favor, preencha o campo nome e telefone"; 8. }); 9. </script> 10. </head> 11. <body ng-controller="listaTelefonicaCtrl"> 12. <div class="alert"> 13. <div class='alert-topic'>Ops, um problema aconteceu!</div> 14. <div class='alert-description'>{{mensagem}}</div> 15. </div> 16. </body> 17. </html>
  • 13. template / templateUrl Especifica o template ou a url do template que deverá ser incluído dentro do elemento que estiver utilizando a diretiva.
  • 14. 1. <html ng-app="listaTelefonica"> 2. <head> 3. <script src='angular.js'></script> 4. <script> 5. var app = angular.module("listaTelefonica", []); 6. app.controller("listaTelefonicaCtrl", function ($scope) { 7. $scope.mensagem = "Por favor, preencha o campo nome e telefone"; 8. }); 9. </script> 10. </head> 11. <body ng-controller="listaTelefonicaCtrl"> 12. <div class="alert"> 13. <div class='alert-topic'>Ops, um problema aconteceu!</div> 14. <div class='alert-description'>{{mensagem}}</div> 15. </div> 16. </body> 17. </html>
  • 15. 1. <html ng-app="listaTelefonica"> 2. <head> 3. <script src='angular.js'></script> 4. <script> 5. var app = angular.module("listaTelefonica", []); 6. app.controller("listaTelefonicaCtrl", function ($scope) { 7. $scope.mensagem = "Por favor, preencha o campo nome e telefone"; 8. }); 9. </script> 10. </head> 11. <body ng-controller="listaTelefonicaCtrl"> 12. <div class="alert"> 13. <div class='alert-topic'>Ops, um problema aconteceu!</div> 14. <div class='alert-description'>{{mensagem}}</div> 15. </div> 16. </body> 17. </html>
  • 16. 1. <html ng-app="listaTelefonica"> 2. <head> 3. <script src='angular.js'></script> 4. <script> 5. var app = angular.module("listaTelefonica", []); 6. app.controller("listaTelefonicaCtrl", function ($scope) { 7. $scope.mensagem = "Por favor, preencha o campo nome e telefone"; 8. }); 9. </script> 10. </head> 11. <body ng-controller="listaTelefonicaCtrl"> 12. </body> 13. </html>
  • 17. 1. <html ng-app="listaTelefonica"> 2. <head> 3. <script src='angular.js'></script> 4. <script> 5. var app = angular.module("listaTelefonica", []); 6. app.controller("listaTelefonicaCtrl", function ($scope) { 7. $scope.mensagem = "Por favor, preencha o campo nome e telefone"; 8. }); 9. </script> 10. </head> 11. <body ng-controller="listaTelefonicaCtrl"> 12. <div alert></div> 13. </body> 14. </html>
  • 18. 1. <div alert></div> Diretiva antes da compilação
  • 19. 1. app.directive("alert", function () { 2. return { 3. }; 4. });
  • 20. 1. app.directive("alert", function () { 2. return { 3. template: 4. }; 5. });
  • 21. 1. app.directive("alert", function () { 2. return { 3. template: 4. "<div class='alert'>" + 5. "<div class='alert-topic'>Ops, um problema aconteceu!</div>" + 6. "<div class='alert-description'>{{mensagem}}</div>" + 7. "</div>" 8. }; 9. });
  • 22. 1. app.directive("alert", function () { 2. return { 3. template: 4. "<div class='alert'>" + 5. "<div class='alert-topic'>Ops, um problema aconteceu!</div>" + 6. "<div class='alert-description'>{{mensagem}}</div>" + 7. "</div>" 8. }; 9. });
  • 23. 1. app.directive("alert", function () { 2. return { 3. }; 4. });
  • 24. 1. app.directive("alert", function () { 2. return { 3. templateUrl: "alert.html" 4. }; 5. });
  • 25. 1. app.directive("alert", function () { 2. return { 3. templateUrl: "alert.html" 4. }; 5. });
  • 26. 1. <div alert=""> 2. <div class="alert"> 3. <div class="alert-topic">Ops, um problema aconteceu!</div> 4. <div class="alert-description">Por favor, preencha o campo nome e telefone</div> 5. </div> 6. </div> Diretiva depois da compilação
  • 27. replace Substitui o elemento pelo conteúdo do template.
  • 28. 1. <div alert=""> 2. <div class="alert"> 3. <div class="alert-topic">Ops, um problema aconteceu!</div> 4. <div class="alert-description">Por favor, preencha o campo nome e telefone</div> 5. </div> 6. </div> Diretiva depois da compilação
  • 29. 1. <div alert=""> 2. <div class="alert"> 3. <div class="alert-topic">Ops, um problema aconteceu!</div> 4. <div class="alert-description">Por favor, preencha o campo nome e telefone</div> 5. </div> 6. </div> Diretiva depois da compilação
  • 30. 1. app.directive("alert", function () { 2. return { 3. templateUrl: "alert.html" 4. }; 5. });
  • 31. 1. app.directive("alert", function () { 2. return { 3. templateUrl: "alert.html", 4. replace: true 5. }; 6. });
  • 32. 1. <div alert=""> 2. <div class="alert"> 3. <div class="alert-topic">Ops, um problema aconteceu!</div> 4. <div class="alert-description">Por favor, preencha o campo nome e telefone</div> 5. </div> 6. </div> Diretiva depois da compilação
  • 33. 1. <div class="alert"> 2. <div class="alert-topic">Ops, um problema aconteceu!</div> 3. <div class="alert-description">Por favor, preencha o campo nome e telefone</div> 4. </div> Diretiva depois da compilação
  • 34. restrict Restringe o modo de utilização da diretiva ao atributo, elemento, classe e comentário, ou ainda uma combinação deles. Caso não seja definido, o padrão é que a diretiva seja atribuída pelo atributo.
  • 35. Tipos de restrição A - Diretiva restrita ao atributo do elemento E - Diretiva restrita ao elemento C - Diretiva restrita a classe do elemento M - Diretiva restrita ao comentário do elemento
  • 36. 1. <div alert></div> Diretiva restrita ao atributo do elemento
  • 37. 1. app.directive("alert", function () { 2. return { 3. templateUrl: "alert.html", 4. replace: true, 5. restrict: "A" 6. }; 7. });
  • 39. 1. app.directive("alert", function () { 2. return { 3. templateUrl: "alert.html", 4. replace: true, 5. restrict: "E" 6. }; 7. });
  • 40. 1. <div class="alert"></div> Diretiva restrita a classe do elemento
  • 41. 1. app.directive("alert", function () { 2. return { 3. templateUrl: "alert.html", 4. replace: true, 5. restrict: "C" 6. }; 7. });
  • 42. 1. <!-- directive: alert--> 2. <div></div> Diretiva restrita ao comentário do elemento
  • 43. 1. app.directive("alert", function () { 2. return { 3. templateUrl: "alert.html", 4. replace: true, 5. restrict: "M" 6. }; 7. });
  • 44. scope Por padrão, uma diretiva compartilha o mesmo scope de onde é utilizada. Para aumentar seu potencial de reuso, podemos isolar seu scope, passando os dados necessário por parâmetro.
  • 45. @ Vincula um atributo a uma propriedade do scope da diretiva
  • 48. 1. <alert message="Por favor, preencha o campo nome e telefone"> 2. </alert>
  • 49. 1. app.directive("alert", function () { 2. return { 3. templateUrl: "alert.html", 4. replace: true, 5. restrict: "E" 6. }; 7. });
  • 50. 1. app.directive("alert", function () { 2. return { 3. templateUrl: "alert.html", 4. replace: true, 5. restrict: "E", 6. scope: { 7. } 8. }; 9. });
  • 51. 1. app.directive("alert", function () { 2. return { 3. templateUrl: "alert.html", 4. replace: true, 5. restrict: "E", 6. scope: { 7. message: "@message" 8. } 9. }; 10. });
  • 52. 1. app.directive("alert", function () { 2. return { 3. templateUrl: "alert.html", 4. replace: true, 5. restrict: "E", 6. scope: { 7. message: "@" 8. } 9. }; 10. });
  • 53. = Cria um vínculo bi-direcional entre uma propriedade do scope do template a uma propriedade do scope da diretiva
  • 54. 1. <alert message="Por favor, preencha o campo nome e telefone"> 2. </alert>
  • 57. 1. app.directive("alert", function () { 2. return { 3. templateUrl: "alert.html", 4. replace: true, 5. restrict: "E", 6. scope: { 7. message: "=message" 8. } 9. }; 10. });
  • 58. 1. app.directive("alert", function () { 2. return { 3. templateUrl: "alert.html", 4. replace: true, 5. restrict: "E", 6. scope: { 7. message: "=" 8. } 9. }; 10. });
  • 59. transclude É possível encapsular elementos dentro de uma diretiva.
  • 61. 1. <alert> 2. Por favor, preencha o campo nome e telefone 3. </alert>
  • 62. 1. app.directive("alert", function () { 2. return { 3. templateUrl: "alert.html", 4. replace: true, 5. restrict: "E", 6. transclude: true 7. }; 8. });
  • 63. 1. <div class="alert"> 2. <div class="alert-topic">Ops, um problema aconteceu!</div> 3. <div class="alert-description" ng-transclude></div> 4. </div> alert.html
  • 64. 1. <div class="alert"> 2. <div class="alert-topic">Ops, um problema aconteceu!</div> 3. <div class="alert-description" ng-transclude> 4. Por favor, preencha o campo nome e telefone 5. </div> 6. </div> Diretiva depois da compilação
  • 65. Por dentro das propriedades das diretivas para criação de diretivas avançadas • link • require • controller • compile
  • 66. link Por meio da função link, podemos interagir com a DOM, vinculando eventos ou mesmo executar um procedimento de inicialização da diretiva.
  • 71. 1. <accordion-item title="Rodrigo Branas"> 2. </accordion-item> 3. <accordion-item title="João da Silva"> 4. </accordion-item> 5. <accordion-item title="Pedro Cavalcante"> 6. </accordion-item>
  • 72. 1. <accordion-item title="Rodrigo Branas"> 2. Agile Code</br> 3. [email protected]</br> 4. http://www.agilecode.com.br</br> 5. </accordion-item> 6. <accordion-item title="João da Silva"> 7. </accordion-item> 8. <accordion-item title="Pedro Cavalcante"> 9. </accordion-item>
  • 73. 1. <accordion-item title="Rodrigo Branas"> 2. Agile Code</br> 3. [email protected]</br> 4. http://www.agilecode.com.br</br> 5. </accordion-item> 6. <accordion-item title="João da Silva"> 7. Google</br> 8. [email protected]</br> 9. http://www.google.com</br> 10. </accordion-item> 11. <accordion-item title="Pedro Cavalcante"> 12. </accordion-item>
  • 74. 1. <accordion-item title="Rodrigo Branas"> 2. Agile Code</br> 3. [email protected]</br> 4. http://www.agilecode.com.br</br> 5. </accordion-item> 6. <accordion-item title="João da Silva"> 7. Google</br> 8. [email protected]</br> 9. http://www.google.com</br> 10. </accordion-item> 11. <accordion-item title="Pedro Cavalcante"> 12. Microsoft</br> 13. [email protected]</br> 14. http://www.microsoft.com</br> 15. </accordion-item>
  • 75. 1. app.directive("accordionItem", function () { 2. return { 3. templateUrl: "accordion-item.html", 4. restrict: "E", 5. transclude: true, 6. replace: true, 7. scope: { 8. title: "@" 9. } 10. }; 11. });
  • 76. Parâmetros da função link • scope • element • attrs • controller • transclude
  • 77. 1. app.directive("accordionItem", function () { 2. return { 3. templateUrl: "accordion-item.html", 4. restrict: "E", 5. transclude: true, 6. replace: true, 7. scope: { 8. title: "@" 9. } 10. }; 11. });
  • 78. 1. app.directive("accordionItem", function () { 2. return { 3. templateUrl: "accordion-item.html", 4. restrict: "E", 5. transclude: true, 6. replace: true, 7. scope: { 8. title: "@" 9. }, 10. link: function (scope, element, attrs, ctrl, transcludeFn) { 11. } 12. }; 13. });
  • 79. 1. app.directive("accordionItem", function () { 2. return { 3. templateUrl: "accordion-item.html", 4. restrict: "E", 5. transclude: true, 6. replace: true, 7. scope: { 8. title: "@" 9. }, 10. link: function (scope, element, attrs, ctrl, transcludeFn) { 11. element.bind("click", function () { 12. }); 13. } 14. }; 15. });
  • 80. 1. app.directive("accordionItem", function () { 2. return { 3. templateUrl: "accordion-item.html", 4. restrict: "E", 5. transclude: true, 6. replace: true, 7. scope: { 8. title: "@" 9. }, 10. link: function (scope, element, attrs, ctrl, transcludeFn) { 11. element.bind("click", function () { 12. scope.$apply(function () { 13. scope.showDescription = !scope.showDescription; 14. }); 15. }); 16. } 17. }; 18. });
  • 81. 1. <div> 2. <div class='accordion-topic'>{{title}}</div> 3. <div class='accordion-description' ng-show='showDescription' ng-transclude> 4. </div> 5. </div> accordion-item.html
  • 82. require Cria um vínculo com outra diretiva, recebendo seu controller como parâmetro na função link.
  • 87. 1. <accordion-item title="Rodrigo Branas"> 2. Agile Code</br> 3. [email protected]</br> 4. http://www.agilecode.com.br</br> 5. </accordion-item> 6. <accordion-item title="João da Silva"> 7. Google</br> 8. [email protected]</br> 9. http://www.google.com</br> 10. </accordion-item> 11. <accordion-item title="Pedro Cavalcante"> 12. Microsoft</br> 13. [email protected]</br> 14. http://www.microsoft.com</br> 15. </accordion-item>
  • 88. 1. <accordion> 2. <accordion-item title="Rodrigo Branas"> 3. Agile Code</br> 4. [email protected]</br> 5. http://www.agilecode.com.br</br> 6. </accordion-item> 7. <accordion-item title="João da Silva"> 8. Google</br> 9. [email protected]</br> 10. http://www.google.com</br> 11. </accordion-item> 12. <accordion-item title="Pedro Cavalcante"> 13. Microsoft</br> 14. [email protected]</br> 15. http://www.microsoft.com</br> 16. </accordion-item> 17. </accordion>
  • 89. 1. <accordion> 2. <accordion-item title="Rodrigo Branas"> 3. Agile Code</br> 4. [email protected]</br> 5. http://www.agilecode.com.br</br> 6. </accordion-item> 7. <accordion-item title="João da Silva"> 8. Google</br> 9. [email protected]</br> 10. http://www.google.com</br> 11. </accordion-item> 12. <accordion-item title="Pedro Cavalcante"> 13. Microsoft</br> 14. [email protected]</br> 15. http://www.microsoft.com</br> 16. </accordion-item> 17. </accordion>
  • 90. 1. app.directive("accordionItem", function () { 2. return { 3. templateUrl: "accordion-item.html", 4. restrict: "E", 5. transclude: true, 6. replace: true, 7. scope: { 8. title: "@" 9. }, 10. link: function (scope, element, attrs, ctrl, transcludeFn) { 11. element.bind("click", function () { 12. scope.$apply(function () { 13. scope.showDescription = !scope.showDescription; 14. }); 15. }); 16. } 17. }; 18. });
  • 91. 1. app.directive("accordionItem", function () { 2. return { 3. templateUrl: "accordion-item.html", 4. restrict: "E", 5. transclude: true, 6. replace: true, 7. scope: { 8. title: "@" 9. }, 10. require: "^accordion", 11. link: function (scope, element, attrs, ctrl, transcludeFn) { 12. element.bind("click", function () { 13. scope.$apply(function () { 14. scope.showDescription = !scope.showDescription; 15. }); 16. }); 17. } 18. }; 19. });
  • 92. 1. app.directive("accordionItem", function () { 2. return { 3. templateUrl: "accordion-item.html", 4. restrict: "E", 5. transclude: true, 6. replace: true, 7. scope: { 8. title: "@" 9. }, 10. require: "^accordion", 11. link: function (scope, element, attrs, ctrl, transcludeFn) { 12. element.bind("click", function () { 13. scope.$apply(function () { 14. scope.showDescription = !scope.showDescription; 15. }); 16. }); 17. } 18. }; 19. });
  • 93. 1. app.directive("accordionItem", function () { 2. return { 3. templateUrl: "accordion-item.html", 4. restrict: "E", 5. transclude: true, 6. replace: true, 7. scope: { 8. title: "@" 9. }, 10. require: "^accordion", 11. link: function (scope, element, attrs, ctrl, transcludeFn) { 12. element.bind("click", function () { 13. ctrl.closeAllAccordionItens(); 14. scope.$apply(function () { 15. scope.showDescription = !scope.showDescription; 16. }); 17. }); 18. } 19. }; 20. });
  • 94. 1. app.directive("accordionItem", function () { 2. return { 3. templateUrl: "accordion-item.html", 4. restrict: "E", 5. transclude: true, 6. replace: true, 7. scope: { 8. title: "@" 9. }, 10. require: "^accordion", 11. link: function (scope, element, attrs, ctrl, transcludeFn) { 12. element.bind("click", function () { 13. ctrl.closeAllAccordionItens(); 14. scope.$apply(function () { 15. scope.showDescription = !scope.showDescription; 16. }); 17. }); 18. } 19. }; 20. });
  • 95. 1. app.directive("accordionItem", function () { 2. return { 3. templateUrl: "accordion-item.html", 4. restrict: "E", 5. transclude: true, 6. replace: true, 7. scope: { 8. title: "@" 9. }, 10. require: "^accordion", 11. link: function (scope, element, attrs, ctrl, transcludeFn) { 12. ctrl.addAccordionItemScope(scope); 13. element.bind("click", function () { 14. ctrl.closeAllAccordionItens(); 15. scope.$apply(function () { 16. scope.showDescription = !scope.showDescription; 17. }); 18. }); 19. } 20. }; 21. });
  • 96. 1. app.directive("accordionItem", function () { 2. return { 3. templateUrl: "accordion-item.html", 4. restrict: "E", 5. transclude: true, 6. replace: true, 7. scope: { 8. title: "@" 9. }, 10. require: "^accordion", 11. link: function (scope, element, attrs, ctrl, transcludeFn) { 12. ctrl.addAccordionItemScope(scope); 13. element.bind("click", function () { 14. ctrl.closeAllAccordionItens(); 15. scope.$apply(function () { 16. scope.showDescription = !scope.showDescription; 17. }); 18. }); 19. } 20. }; 21. });
  • 97. controller Permite a criação e o compartilhamento de comportamento com outras diretivas.
  • 98. 1. app.directive("accordion", function () { 2. return { 3. template: "<div ng-transclude></div>", 4. restrict: "E", 5. transclude: true, 6. replace: true, 7. controller: function ($scope, $element, $attrs) { 8. var itensScope = []; 9. 10. var addAccordionItemScope = function (scope) { 11. itensScope.push(scope); 12. }; 13. 14. var closeAllAccordionItens = function () { 15. angular.forEach(itensScope, function (scope) { 16. scope.showItem = false; 17. }); 18. }; 19. 20. return { 21. addAccordionItemScope: addAccordionItemScope, 22. closeAllAccordionItens: closeAllAccordionItens 23. }; 24. } 25. }; 26. });