Diretivas PERSONALIZADAS em AngularJS: como criar? [Exemplos]

O que รฉ Diretiva Aduaneira?

A Diretiva Aduaneira em AngularJS รฉ uma diretiva definida pelo usuรกrio que permite aos usuรกrios usar as funรงรตes desejadas para estender a funcionalidade HTML. Pode ser definido atravรฉs da funรงรฃo โ€œdiretivaโ€ e substitui o elemento para o qual รฉ utilizado. Embora o AngularJS tenha muitas diretivas poderosas prontas para uso, ร s vezes sรฃo necessรกrias diretivas personalizadas.

Como criar uma diretiva personalizada?

Vamos dar uma olhada em um exemplo de como podemos criar uma diretiva personalizada AngularJS.

A diretiva customizada em nosso caso irรก simplesmente injetar uma tag div que contรฉm o texto โ€œTutorial AngularJSโ€ em nossa pรกgina quando a diretiva for chamada.

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp">
    <div ng-guru=""></div>

</div>

<script type="text/javascript">
    var app = angular.module('DemoApp',[]);
    app.directive('ngGuru',function(){

    return {
        template: '<div>Angular JS Tutorial</div>'
    }
    });

</script>

</body>
</html>

Crie uma diretiva personalizada

Code Explicaรงรฃo

  1. Estamos primeiro criando um mรณdulo para nossa aplicaรงรฃo angular. Isto รฉ necessรกrio para criar uma diretiva personalizada porque a diretiva serรก criada usando este mรณdulo.
  2. Estamos criando uma diretiva personalizada chamada โ€œngโ€Guru"e definindo uma funรงรฃo que terรก cรณdigo personalizado para nossa diretiva."Nota:- Note que, ao definir a diretiva, a definimos como ngGuru com a letra 'G' maiรบscula. E quando acessamos a diretiva a partir da nossa tag div, estamos acessando-a como ng-guru. ร‰ assim que o Angular entende as diretivas personalizadas definidas em uma aplicaรงรฃo. Primeiro, o nome da diretiva personalizada deve comeรงar com as letras 'ng'. Segundo, o hรญfen '-' deve ser mencionado apenas ao chamar a diretiva. E terceiro, a primeira letra apรณs 'ng' ao definir a diretiva pode ser maiรบscula ou minรบscula.
  3. Estamos usando o parรขmetro template que รฉ um parรขmetro definido por Angular para diretivas customizadas. Nisto estamos definindo que sempre que esta diretiva for utilizada, basta utilizar o valor do template e injetรก-lo no cรณdigo de chamada.
  4. Aqui estamos agora fazendo uso de nossa diretiva โ€œng-guruโ€ criada sob medida. Quando fazemos isso, o valor que definimos para o nosso modelo โ€œ Tutorial JS Angular โ€ agora serรก injetado aqui.

Se o cรณdigo for executado com sucesso, a seguinte saรญda serรก mostrada quando vocรช executar o cรณdigo no navegador.

Saรญda:

Crie uma diretiva personalizada

A saรญda acima mostra claramente que nossa diretiva ng-guru personalizada, que tem o modelo definido para mostrar um texto personalizado, รฉ exibida no navegador.

Diretivas e escopos do AngularJs

O escopo รฉ definido como a cola que liga o controlador ร  visรฃo, gerenciando os dados entre a visรฃo e o controlador.

Ao criar diretivas AngularJs personalizadas, elas, por padrรฃo, terรฃo acesso ao objeto de escopo no controlador pai.

Dessa forma, fica fรกcil para a diretiva customizada fazer uso dos dados que estรฃo sendo passados โ€‹โ€‹para o controlador principal.

Vejamos um exemplo de diretiva personalizada AngularJS de como podemos usar o escopo de um controlador pai em nossa diretiva personalizada.

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp" ng-controller="DemoController">
    <div ng-guru=""></div>

</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.controller('DemoController',function($scope) {
        $scope.tutorialName = "Angular JS";

    });

        app.directive('ngGuru',function(){
        return {
         template: '<div>{{tutorialName}}</div>'
     }
    });

</script>

</body>
</html>

Diretivas e escopos do AngularJs

Code Explicaรงรฃo

  1. Primeiro criamos um controlador chamado โ€œDemoControllerโ€. Neste, definimos uma variรกvel chamada tutorialName e anexamos-a ao objeto de escopo em uma instruรงรฃo โ€“ $scope.tutorialName = โ€œAngularJSโ€.
  2. Em nossa diretiva customizada, podemos chamar a variรกvel โ€œtutorialNameโ€ usando uma expressรฃo. Esta variรกvel seria acessรญvel porque estรก definida no controlador โ€œDemoControllerโ€, que se tornaria o pai desta diretiva.
  3. Fazemos referรชncia ao controlador em uma tag div, que atuarรก como nossa tag div pai. Observe que isso precisa ser feito primeiro para que nossa diretiva personalizada acesse a variรกvel tutorialName.
  4. Finalmente, apenas anexamos nossa diretiva personalizada โ€œng-guruโ€ ร  nossa tag div.

Se o cรณdigo for executado com sucesso, a seguinte saรญda serรก mostrada quando vocรช executar o cรณdigo no navegador.

Saรญda:

Diretivas e escopos do AngularJs

A saรญda acima mostra claramente que nossa diretiva personalizada โ€œng-guruโ€ faz uso da variรกvel de escopo tutorialName no controlador pai.

Usando controladores com diretivas

Angular dรก a facilidade de acessar a variรกvel de membro do controlador diretamente das diretivas personalizadas sem a necessidade do objeto de escopo.

ร€s vezes, isso se torna necessรกrio porque em um aplicativo vocรช pode ter vรกrios objetos de escopo pertencentes a vรกrios controladores.

Portanto, hรก uma grande chance de vocรช cometer o erro de acessar o objeto de escopo do controlador errado.

Nesse cenรกrio, existe uma maneira de mencionar especificamente โ€œQuero acessar este controlador especรญficoโ€ na minha diretiva.

Vejamos um exemplo de como podemos conseguir isso.

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp" ng-controller="DemoController">
    <div ng-guru99=""></div>

</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.controller('DemoController',function() {
        this.tutorialName = "Angular";

    });

     app.directive('ngGuru99',function(){
        return {
         controller: 'DemoController',

          controllerAs: 'ctrl',

          template: '{{ctrl.tutorialName}}'
     };
    });

</script>

</body>
</html>

Usando controladores com diretivas

Code Explicaรงรฃo

  1. Primeiro criamos um controlador chamado โ€œDemoControllerโ€. Neste definiremos uma variรกvel chamada โ€œtutorialNameโ€ e desta vez ao invรฉs de anexรก-la ao objeto de escopo, iremos anexรก-la diretamente ao controlador.
  2. Em nossa diretiva customizada, mencionamos especificamente que queremos usar o controlador โ€œDemoControllerโ€ usando a palavra-chave do parรขmetro do controlador.
  3. Criamos uma referรชncia ao controlador usando o parรขmetro โ€œcontrollerAsโ€. Isso รฉ definido pelo Angular e รฉ a forma de referenciar o controlador como referรชncia.
  4. Nota: -ร‰ possรญvel acessar vรกrios controladores em uma diretiva especificando os respectivos blocos do controlador, controladorAs e instruรงรตes de modelo.

  5. Finalmente, em nosso modelo, estamos usando a referรชncia criada na etapa 3 e a variรกvel membro que foi anexada diretamente ao controlador na Etapa 1.

Se o cรณdigo for executado com sucesso, a seguinte saรญda serรก mostrada quando vocรช executar o cรณdigo no navegador.

Saรญda:

Usando controladores com diretivas

A saรญda mostra claramente que a diretiva customizada estรก acessando especialmente o DemoController e a variรกvel de membro tutorialName anexada a ela e exibe o texto โ€œAngularโ€.

Como criar diretivas reutilizรกveis

Jรก vimos o poder das diretivas personalizadas, mas podemos levar isso para o prรณximo nรญvel criando as nossas prรณprias diretivas reutilizรกveis.

Digamos, por exemplo, que quisรฉssemos injetar um cรณdigo que sempre mostrasse as tags HTML abaixo em vรกrias telas, o que รฉ basicamente apenas uma entrada para o โ€œNomeโ€ e a โ€œidadeโ€ do usuรกrio.

Para reutilizar esta funรงรฃo em mรบltiplas telas sem codificaรงรฃo a cada vez, criamos um controle mestre ou diretiva em angular para conter esses controles (โ€œNomeโ€ e โ€œidadeโ€ do usuรกrio).

Portanto, agora, em vez de inserir sempre o mesmo cรณdigo na tela abaixo, podemos incorporar esse cรณdigo em uma diretiva e incorporar essa diretiva a qualquer momento.

Vejamos um exemplo de como podemos conseguir isso.

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp">
    <div ng-guru=""></div>

</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.directive('ngGuru',function(){
        return {

            template: '&nbsp;&nbsp;Name <input type="text"><br><br>&nbsp;&nbsp;&nbsp;Age<input type="text">'
        };
    });

</script>

</body>
</html>

Crie diretivas reutilizรกveis

Crie diretivas reutilizรกveis

Code Explicaรงรฃo

  • Em nosso trecho de cรณdigo para uma diretiva customizada, o que muda รฉ apenas o valor que รฉ dado ao parรขmetro de modelo de nossa diretiva customizada. Em vez de uma tag ou texto do plano cinco, estamos na verdade inserindo o fragmento inteiro de 2 controles de entrada para o โ€œ Nomeโ€ e โ€œidadeโ€ que devem ser mostrados em nossa pรกgina.

Se o cรณdigo for executado com sucesso, a seguinte saรญda serรก mostrada quando vocรช executar o cรณdigo no navegador.

Saรญda:

Crie diretivas reutilizรกveis

Na saรญda acima, podemos ver que o trecho de cรณdigo do modelo da diretiva personalizada รฉ adicionado ร  pรกgina.

Diretivas e componentes AngularJS โ€“ ng-transclude

Como mencionamos anteriormente, o objetivo do Angular รฉ estender a funcionalidade do HTML. E jรก vimos como podemos ter injeรงรฃo de cรณdigo usando diretivas reutilizรกveis โ€‹โ€‹personalizadas.

Mas no desenvolvimento moderno de aplicaรงรตes web, existe tambรฉm o conceito de desenvolvimento.ping Componentes web. Basicamente, isso significa criar nossas prรณprias tags HTML que podem ser usadas como componentes em nosso cรณdigo.

Conseqรผentemente, o angular fornece outro nรญvel de poder para estender tags HTML, dando a capacidade de injetar atributos nas prรณprias tags HTML.

Isto รฉ feito pelo โ€œng-transcluirโ€Tag, que รฉ uma espรฉcie de configuraรงรฃo para dizer ao angular para capturar tudo o que รฉ colocado dentro da diretiva na marcaรงรฃo.

Vejamos um exemplo de como podemos conseguir isso.

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp">
    <pane title="{{title}}">Angular JS</pane>

</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.directive('pane',function(){
        return {

            transclude:true,
            scope :{title:'@'},
            template: '<div style="border: 1px solid black;"> '+
                        '<ng-transclude></ng-transclude>'+
                            '</div>'
        };
    });

</script>

</body>
</html>

Diretivas e componentes AngularJS

Code Explicaรงรฃo

  1. Estamos usando a diretiva para definir uma tag HTML personalizada chamada 'pane' e adicionando uma funรงรฃo que colocarรก algum cรณdigo personalizado para esta tag. Na saรญda, nossa tag de painel personalizado exibirรก o texto โ€œAngularJSโ€ em um retรขngulo com uma borda preta sรณlida.
  2. O atributo โ€œtranscludeโ€ deve ser mencionado como true, o que รฉ exigido pelo angular para injetar esta tag em nosso DOM.
  3. No escopo, estamos definindo um atributo de tรญtulo. Os atributos sรฃo normalmente definidos como pares nome/valor como: nome=โ€valorโ€. No nosso caso, o nome do atributo na tag HTML do painel รฉ โ€œtรญtuloโ€. O sรญmbolo โ€œ@โ€ รฉ o requisito do angular. Isso รฉ feito para que quando a linha title={{title}} for executada na Etapa 5, o cรณdigo personalizado para o atributo title seja adicionado ร  tag HTML do painel.
  4. O cรณdigo personalizado para os atributos do tรญtulo que apenas desenha uma borda preta sรณlida para nosso controle.
  5. Finalmente, estamos chamando nossa tag HTML personalizada junto com o atributo title que foi definido.

Se o cรณdigo for executado com sucesso, a seguinte saรญda serรก mostrada quando vocรช executar o cรณdigo no navegador.

Saรญda:

Diretivas e componentes AngularJS

  • A saรญda mostra claramente que o atributo title da tag html5 do painel foi definido com o valor personalizado de โ€œAngular.JSโ€.

Diretivas aninhadas

As diretivas no AngularJS podem ser aninhadas. Como apenas mรณdulos internos ou funรงรตes em qualquer linguagem de programaรงรฃo, talvez seja necessรกrio incorporar diretivas umas nas outras.

Vocรช pode entender melhor isso vendo o exemplo abaixo.

Neste exemplo, estamos criando 2 diretivas chamadas โ€œexternasโ€ e โ€œinternasโ€.

  • A diretiva interna exibe um texto chamado โ€œInnerโ€.
  • Enquanto a diretiva externa na verdade faz uma chamada para a diretiva interna para exibir o texto chamado โ€œInnerโ€.
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp">
    <outer></outer>
</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.directive('outer',function(){
        return {

            restrict:'E',
            template: '<div><h1>Outer</h1><inner></inner></div>',
        }});

    app.directive('inner',function(){
        return {

            restrict:'E',
            template: '<div><h1>Inner</h1></div>',
        }
    });
</script>

</body>
</html>

Diretivas aninhadas

Code Explicaรงรฃo

  1. Estamos criando uma diretiva chamada โ€œexternaโ€ que se comportarรก como nossa diretiva pai. Esta directiva farรก entรฃo um apelo ร  directiva โ€œinternaโ€.
  2. A restriรงรฃo:'E' รฉ exigida pelo angular para garantir que os dados da diretiva interna estejam disponรญveis para a diretiva externa. A letra 'E' รฉ a forma abreviada da palavra 'Elemento'.
  3. Aqui estamos criando a diretiva inner que exibe o texto โ€œInnerโ€ em uma tag div.
  4. No modelo para a diretiva externa (etapa 4), estamos chamando a diretiva interna. Entรฃo aqui estamos injetando o modelo da diretiva interna para a diretiva externa.
  5. Finalmente, estamos a invocar directamente a directiva externa.

Se o cรณdigo for executado com sucesso, a seguinte saรญda serรก mostrada quando vocรช executar o cรณdigo no navegador.

Saรญda:

Diretivas aninhadas

Da saรญda,

  • Pode-se ver que as diretivas externa e interna foram chamadas e o texto em ambas as tags div รฉ exibido.

Tratamento de eventos em uma diretiva

Eventos tais cliques de mouse ou cliques de botรฃo podem ser tratados dentro das prรณprias diretivas. Isso รฉ feito usando a funรงรฃo link. A funรงรฃo link รฉ o que permite que a diretiva se anexe aos elementos DOM em uma pรกgina HTML.

Sintaxe:

A sintaxe do elemento link รฉ mostrada abaixo

ng-repetir

link: function ($scope, element, attrs)

A funรงรฃo de link normalmente aceita 3 parรขmetros incluindo o escopo, o elemento ao qual a diretiva estรก associada e os atributos do elemento de destino.

Vejamos um exemplo de como podemos fazer isso.

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp">
    <div ng-guru="">Click Me</div>
</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.directive('ngGuru',function(){
        return {

            link:function($scope,element,attrs) {
                element.bind('click',function () {
                    element.html('You clicked me');
                });}
        }});
</script>

</body>
</html>

Tratamento de eventos em uma diretiva

Code Explicaรงรฃo

  1. Estamos usando a funรงรฃo link conforme definida em angular para dar ร s diretivas a capacidade de acessar eventos no HTML DOM.
  2. Estamos usando a palavra-chave 'element' porque queremos responder a um evento para um elemento HTML DOM, que no nosso caso serรก o elemento โ€œdivโ€. Estamos entรฃo usando a funรงรฃo โ€œbindโ€ e dizendo que queremos adicionar funcionalidade personalizada ao evento click do elemento. A palavra 'clique' รฉ a palavra-chave usada para denotar o evento de clique de qualquer controle HTML. Por exemplo, o controle de botรฃo HTML possui o evento click. Como, em nosso exemplo, queremos adicionar um cรณdigo personalizado ao evento click de nossa tag โ€œdevโ€, usamos a palavra-chave โ€˜clickโ€™.
  3. Aqui estamos dizendo que queremos substituir o HTML interno do elemento (no nosso caso, o elemento div) pelo texto 'Vocรช clicou em mim!'.
  4. Aqui estamos definindo nossa tag div para usar a diretiva personalizada ng-guru.

Se o cรณdigo for executado com sucesso, a seguinte saรญda serรก mostrada quando vocรช executar o cรณdigo no navegador.

Saรญda:

Tratamento de eventos em uma diretiva

  • Inicialmente serรก mostrado ao usuรกrio o texto 'Click Me' pois รฉ o que foi definido inicialmente na tag div. Quando vocรช realmente clica na tag div, a saรญda abaixo serรก mostrada

Tratamento de eventos em uma diretiva

Resumo

  • Tambรฉm รฉ possรญvel criar uma diretiva personalizada que pode ser usada para injetar cรณdigo no aplicativo angular principal.
  • Diretivas customizadas podem ser feitas para chamar membros definidos no objeto de escopo em um determinado controlador usando as palavras-chave 'Controller', 'controllerAs' e 'template'.
  • As diretivas tambรฉm podem ser aninhadas para fornecer funcionalidades incorporadas que podem ser necessรกrias dependendo da necessidade do aplicativo.
  • As diretivas tambรฉm podem ser reutilizรกveis โ€‹โ€‹para que possam ser usadas para injetar cรณdigo comum que pode ser necessรกrio em vรกrios aplicativos da web.
  • As diretivas tambรฉm podem ser usadas para criar tags HTML personalizadas que teriam sua prรณpria funcionalidade definida de acordo com os requisitos do negรณcio.
  • Os eventos tambรฉm podem ser tratados dentro de diretivas para lidar com eventos DOM, como cliques de botรฃo e mouse.

Resuma esta postagem com: