Mais conteúdo relacionado Semelhante a Construindo Diretivas com AngularJS (20) Mais de Rodrigo Branas (16) Construindo Diretivas com AngularJS1. Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br
Criando Diretivas
com AngularJS
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?
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>
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>
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. });
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
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
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
42. 1. <!-- directive: alert-->
2. <div></div>
Diretiva restrita ao comentário do elemento
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.
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. });
53. =
Cria um vínculo bi-direcional entre
uma propriedade do scope do
template a uma propriedade do
scope da diretiva
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. });
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. 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>
73. 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>
74. 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>
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
87. 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>
88. 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>
89. 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>
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. });
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. });