Como construir diretivas personalizadas em Angular

Um dos principais recursos do Angular são as diretivas. As diretivas angulares são uma forma de adicionar comportamento aos elementos DOM. Angular fornece uma variedade de diretivas integradas e você também pode criar diretivas personalizadas nesta estrutura robusta.

O que são diretivas?

Diretivas são códigos personalizados que o Angular usa para modificar o comportamento ou a aparência de um elemento HTML. Você pode usar diretivas para adicionar ouvintes de eventos, alterar o DOM ou mostrar ou ocultar elementos.

Existem dois tipos de diretivas integradas em Angular, estruturais e de atributos. As diretivas estruturais alteram a estrutura do DOM, enquanto as diretivas de atributos alteram a aparência ou o comportamento de um elemento. As diretivas são uma forma poderosa de estender a funcionalidade dos componentes Angular.

Benefícios das Diretivas

Aqui estão alguns dos benefícios de usar diretivas em Angular:

  • Reutilização: você pode usar diretivas em vários componentes, economizando tempo e esforço.
  • Extensibilidade: você pode estender diretivas para adicionar novas funcionalidades, tornando seus componentes mais poderosos.
  • Flexibilidade: Usando diretivas, você pode modificar o comportamento ou a aparência de um elemento de várias maneiras, proporcionando muita flexibilidade na construção de seus aplicativos.

Configurando seu aplicativo Angular

Para configurar um aplicativo Angular, instale o Angular CLI executando o seguinte código em seu terminal:

 npm install -g @angular/cli

Após instalar o Angular CLI, crie um projeto Angular executando o seguinte comando:

 ng new custom-directives-app

A execução do comando acima criará um projeto Angular denominado custom-directives-app.

Criando uma diretiva personalizada

Agora você tem um projeto Angular e pode começar a criar suas diretivas personalizadas. Crie um arquivo TypeScript e defina uma classe decorada com o decorador @Directive.

  20 melhores sites gratuitos de compartilhamento e armazenamento de arquivos online

O decorador @Directive é um decorador TypeScript usado para criar diretivas personalizadas. Agora crie um arquivo destaque.directive.ts no diretório src/app. Neste arquivo, você criará o destaque da diretiva personalizada.

Por exemplo:

 import { Directive } from "@angular/core";

@Directive({
  selector: "[myHighlight]",
})
export class HighlightDirective {
  constructor() {}
}

O bloco de código acima importa o decorador de diretiva do módulo @angular/core. O decorador @Directive decora a classe HighlightDirective. Leva um objeto como argumento com uma propriedade de seletor.

Neste caso, você define a propriedade do seletor como [myHighlight] o que significa que você pode aplicar esta diretiva aos seus modelos adicionando o atributo myHighlight a um elemento.

Aqui está um exemplo de como usar a diretiva em seus modelos:

 <main>
<p myHighlight>Some text</p>
</main>

Adicionando Comportamento à Diretiva

Agora você criou uma diretiva com sucesso. O próximo passo é adicionar um comportamento à diretiva para que ela possa manipular o DOM. Você precisará do ElementRef de @angular/core para adicionar um comportamento a uma diretiva.

Você injetará ElementRef no construtor da diretiva. ElementRef é um wrapper em torno de um elemento nativo dentro de uma visualização.

Aqui está um exemplo de como você adiciona um comportamento a uma diretiva:

 import { Directive, ElementRef } from "@angular/core";

@Directive({
    selector: "[myHighlight]"
})
export class HighlightDirective {
    constructor(private element: ElementRef) {
        this.element.nativeElement.style.backgroundColor="lightblue";
    }
}

Neste exemplo, o construtor da classe HighlightDirective usa um parâmetro ElementRef, que o Angular injeta automaticamente. O ElementRef fornece acesso ao elemento DOM subjacente.

Usando a propriedade this.element.nativeElement, você acessa o elemento DOM nativo do parâmetro element. Em seguida, você define a cor de fundo do componente como azul claro usando a propriedade style. Isso significa que qualquer elemento ao qual você aplicar a diretiva myHighlight terá um fundo azul claro.

  Como usar gestos de edição de texto em seu iPhone e iPad

Para tornar a diretiva funcional, certifique-se de importá-la e declará-la no arquivo app.module.ts.

Por exemplo:

 import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { HighlightDirective } from './highlight.directive';

@NgModule({
  declarations: [
    AppComponent,
    HighlightDirective,
  ],
  imports: [
    BrowserModule,
    AppRoutingModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Agora você pode aplicar a diretiva myHighlight aos elementos dos seus componentes Angular.

 <main>
<p myHighlight>Some text</p>
</main>

Execute seu aplicativo no servidor de desenvolvimento para testar se a diretiva está funcional. Você pode fazer isso executando o seguinte comando em seu terminal:

 ng serve

Após executar o comando, navegue até http://localhost:4200/ em seu navegador e você verá uma interface semelhante à imagem abaixo.

As diretivas angulares integradas aceitam valores para alterar a aparência do elemento, mas a diretiva personalizada myHighlight não. Você pode configurar a diretiva para aceitar um valor que será usado para definir dinamicamente a cor de fundo do modelo.

Para fazer isso, substitua o código no arquivo destaque.directive.ts por este:

 import { Directive, ElementRef, Input } from "@angular/core";

@Directive({
    selector: "[myHighlight]"
})

export class HighlightDirective {
    @Input() set myHighlight(color: string) {
        this.element.nativeElement.style.backgroundColor = color;
    }

    constructor(private element: ElementRef) {
    }
}

No bloco de código acima, a classe HighlightDirective contém um método setter chamado myHighlight. Este método usa um parâmetro de cor do tipo string. Você decora o método setter com o decorador @Input, permitindo passar o valor da cor para a diretiva do componente pai.

Agora você pode determinar a cor de fundo passando um valor para a diretiva myHighlight.

Por exemplo:

 <main>
<p myHighlight="pink">Some text</p>
</main>

Criando uma diretiva estrutural personalizada

Nas seções anteriores, você aprendeu como criar, adicionar comportamentos e aplicar diretivas de atributos customizados ao seu modelo. As diretivas de atributos alteram a aparência dos elementos DOM, enquanto as diretivas estruturais adicionam, removem ou movem elementos no DOM.

  10 melhores ferramentas de ETL para SMBs usarem em 2022

Angular fornece duas diretivas estruturais, ngFor e ngIf. A diretiva ngFor renderiza um modelo para cada item em uma coleção (array), enquanto a ngIf trata da renderização condicional.

Nesta seção, você criará uma diretiva estrutural personalizada que funciona como a diretiva ngIf. Para fazer isso, crie um arquivo condição.directive.ts.

No arquivo condição.directive.ts, escreva este código:

 import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core'

@Directive({
    selector: "[condition]"
})

export class ConditionDirective {

    @Input() set condition(arg: boolean) {
        if(arg) {
            this.viewContainer.createEmbeddedView(this.template)
        } else {
            this.viewContainer.clear();
        }
    }

    constructor(
private template: TemplateRef<unknown>,
private viewContainer: ViewContainerRef
) {}
}

Este bloco de código permite renderizar elementos condicionalmente aplicando a diretiva de condição a um elemento e passando um valor booleano do componente pai.

No construtor da classe ConditionDirective, você injeta uma instância de TemplateRef e ViewContainerRef. O TemplateRef representa o modelo associado à diretiva e o ViewContainerRef representa o contêiner onde o aplicativo renderiza as visualizações.

O método setter de classe ConditionDirective usa uma instrução if else para verificar o parâmetro arg. A diretiva cria uma visualização incorporada usando o modelo fornecido se o parâmetro for verdadeiro. O método createEmbeddedView da classe ViewContainerRef cria e renderiza a visualização no DOM.

Se o parâmetro for falso, a diretiva limpa o contêiner de visualização usando o método clear da classe ViewContainerRef. Isso remove quaisquer visualizações renderizadas anteriormente do DOM.

Após criar a diretiva, registre-a em seu projeto importando-a e declarando-a no arquivo app.module.ts. Depois de fazer isso, você pode começar a usar a diretiva em seus modelos.

Aqui está um exemplo de como usá-lo em seus modelos:

 <main>
<p *condition="true">Hello There!!!</p>
</main>

Agora você pode criar diretivas personalizadas

As diretivas personalizadas no Angular fornecem uma maneira poderosa de manipular o DOM e adicionar comportamento dinâmico aos seus modelos. Você aprendeu como criar e aplicar atributos personalizados e diretivas estruturais em seus aplicativos Angular. Ao compreender como criar e usar diretivas personalizadas, você poderá aproveitar ao máximo os recursos do Angular.