Criando Diretivas Estruturais - Angular
Vamos criar uma diretiva estrutural simples. Adicionaremos um novo arquivo ao projeto na pasta src/app
while.directive.ts
helloapp/ ├── src/ │ ├── app/ │ │ ├── app.component.ts │ │ ├── while.directive.ts │ ├── main.ts │ ├── index.html ├── angular.json ├── package-lock.json ├── package.json └── tsconfig.json
Esse arquivo conterá a diretiva. Definiremos o seguinte código no arquivo:
import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';
@Directive({
selector: '[while]',
standalone: true,
})
export class WhileDirective {
constructor(
private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef
) {}
@Input() set while(condition: boolean) {
if (condition) {
this.viewContainer.createEmbeddedView(this.templateRef);
} else {
this.viewContainer.clear();
}
}
}
A diretiva estrutural deve aplicar o decorador @Directive
"while"
Para obter acesso ao modelo da diretiva, usamos o objeto TemplateRef
ViewContainerRef
private
constructor(private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef) { }
Usamos uma propriedade de entrada (input
@Input
@Input() set while(condition: boolean) {
if (condition) {
this.viewContainer.createEmbeddedView(this.templateRef);
} else {
this.viewContainer.clear();
}
}
Se condition
true
this.viewContainer.createEmbeddedView(this.templateRef);
Caso contrário, se condition
false
this.viewContainer.clear()
Basicamente, essa diretiva funciona como um análogo do ngIf
Agora, vamos aplicar a diretiva no componente principal, AppComponent
import { Component } from '@angular/core';
import { WhileDirective } from './while.directive';
@Component({
selector: 'my-app',
standalone: true,
imports: [WhileDirective],
template: `<p *while="condition">Primeiro parágrafo</p>
<p *while="!condition">Segundo parágrafo</p>
<button (click)="toggle()">Alternar</button>`,
})
export class AppComponent {
condition = true;
toggle() {
this.condition = !this.condition;
}
}
Após executar a aplicação, será possível controlar a adição ou remoção de determinados blocos da página web utilizando essa diretiva:
