Diretivas Estruturais: ngIf, ngFor, ngSwitch - Angular
As diretivas estruturais no Angular permitem modificar a estrutura do DOM, adicionando ou removendo elementos HTML. Vamos explorar três diretivas estruturais: ngIf
ngSwitch
ngFor
ngIf
A diretiva ngIf
import { Component } from "@angular/core";
import { NgIf } from "@angular/common";
@Component({
selector: "my-app",
standalone: true,
imports: [NgIf],
template: `<p *ngIf="condition">Olá, mundo</p>
<p *ngIf="!condition">Adeus, mundo</p>
<button (click)="toggle()">Toggle</button>`
})
export class AppComponent {
condition: boolean = true;
toggle() {
this.condition = !this.condition;
}
}
Para utilizar a diretiva, é necessário importar a classe NgIf
"@angular/common"
No template do componente, dependendo do valor da propriedade condition, será exibido o primeiro ou o segundo parágrafo.

Podemos definir expressões alternativas usando a diretiva ng-template
import { Component } from "@angular/core";
import { NgIf } from "@angular/common";
@Component({
selector: "my-app",
standalone: true,
imports: [NgIf],
template: `<p *ngIf="condition; else unset">Olá, mundo</p>
<ng-template #unset>
<p>Adeus, mundo</p>
</ng-template>
<button (click)="toggle()">Toggle</button>`
})
export class AppComponent {
condition = true;
toggle() {
this.condition = !this.condition;
}
}
A expressão *ngIf="condition; else unset"
<ng-template #unset>
Também podemos definir uma lógica mais sofisticada. Por exemplo, podemos alterar o template do componente da seguinte maneira:
template: `<div *ngIf="condition; then thenBlock else elseBlock"></div>
<ng-template #thenBlock>Bloco then</ng-template>
<ng-template #elseBlock>Bloco else</ng-template>
<button (click)="toggle()">Toggle</button>`
Nesse caso, se condition for true
thenBlock
elseBlock
ngFor
A diretiva ngFor
import { Component } from "@angular/core";
import { NgFor } from "@angular/common";
@Component({
selector: "my-app",
standalone: true,
imports: [NgFor],
template: `<ul>
<li *ngFor="let item of items">{{item}}</li>
</ul>`
})
export class AppComponent {
items = ["Tom", "Bob", "Sam", "Bill"];
}
A diretiva recebe uma expressão de iteração similar ao foreach
let item of items
item
Durante a iteração, o índice atual do item está disponível por meio da variável index
<div>
<p *ngFor="let item of items; let i = index">{{i+1}}. {{item}}</p>
</div>
Vale lembrar que a indexação começa em zero, por isso, para que a contagem inicie em um, adicionamos um ao valor da variável i

Símbolo de Asterisco e Açúcar Sintático
É possível notar que, ao utilizar as diretivas ngFor
ngIf
ngIf
<p *ngIf="condition">Olá, mundo</p>
<p *ngIf="!condition">Adeus, mundo</p>
Na verdade, representa o seguinte código:
<ng-template [ngIf]="condition">
<p>Olá, mundo</p>
</ng-template>
<ng-template [ngIf]="!condition">
<p>Adeus, mundo</p>
</ng-template>
Nesse caso, o parágrafo e seu texto são movidos para dentro do elemento <ng-template>
<ng-template>
Podemos escolher entre o primeiro método, com o asterisco, que é mais compacto, ou o segundo, utilizando os elementos ng-template
O mesmo se aplica à diretiva ngFor
<ul>
<li *ngFor="let item of items">{{item}}</li>
</ul>
Esse código é equivalente ao seguinte:
<ul>
<ng-template ngFor let-item [ngForOf]="items">
<li>{{item}}</li>
</ng-template>
</ul>
ngSwitch
A diretiva ngSwitch
switch..case
import { Component } from "@angular/core";
import { NgSwitch, NgSwitchCase, NgSwitchDefault } from "@angular/common";
dd@Component({
selector: "my-app",
standalone: true,
imports: [NgSwitch, NgSwitchCase, NgSwitchDefault],
template: `<div [ngSwitch]="count">
<ng-template ngSwitchCase="1">{{count * 10}}</ng-template>
<ng-template ngSwitchCase="2">{{count * 100}}</ng-template>
<ng-template ngSwitchDefault>{{count * 1000}}</ng-template>
</div>`
})
export class AppComponent {
count = 5;
}
A diretiva ngSwitch
count
<ng-template>
ngSwitchCase
ngSwitch
ngSwitchCase
ngSwitchCase
ngSwitchDefault