GUIDE PER ASPIRANTI PROGRAMMATORI
Built-in control flow in Angular
Precedentemente abbiamo visto come con le direttive strutturali sia possibile condizionare o ripetere dei blocchi di template. Abbiamo anche accennato che è stata recentemente introdotta una nuova sintassi chiamata built-in control flow (flusso di controllo integrato), che consente di dichiarare blocchi if, switch e for introducendoli con @; ne abbiamo visto un esempio nella sezione…
Vuoi avviare una nuova carriera o fare un upgrade?
Trova il corso Digital & Tech più adatto a te nel nostro catalogo!
- Le direttive in Angular
- I componenti in Angular
- Il template in Angular
- Le direttive strutturali in Angular
- La content projection in Angular
- I servizi in Angular
- Le Pipes in Angular
- Routing in Angular
- Invio di form in Angular
- Built-in control flow in Angular
- Deferrable views in Angular
- Image optimization in Angular
- Standalone components in Angular
Precedentemente abbiamo visto come con le direttive strutturali sia possibile condizionare o ripetere dei blocchi di template. Abbiamo anche accennato che è stata recentemente introdotta una nuova sintassi chiamata built-in control flow (flusso di controllo integrato), che consente di dichiarare blocchi if, switch e for introducendoli con @; ne abbiamo visto un esempio nella sezione sui form, dove abbiamo usato dei blocchi @if per condizionare la presenza dei messaggi d’errore.
Vediamo, dunque, nel dettaglio questi costrutti che sostituiscono con diverse ottimizzazioni le direttive strutturali.
@if in Angular.
Con @if si introduce un blocco condizionale che verrà mostrato se la condizione espressa è veritiera:
@if (error) {
<p class="error">Something's wrong.</p>
}
È possibile assegnare un alias all’espressione usata come condizione, ad esempio per estrarne il valore trasformato da una pipe:
@if (user$ | async; as user) {
<p>Name: {{user.name}}</p>
<p>Surname: {{user.surname}}</p>
}
Qui user$ è una proprietà del compontente di tipo Observable<{ name: string; surname: string }> o Promise<{ name: string; surname: string }>; la variabile user rappresenta il valore corrispondente estratto dalla AsyncPipe.
Il blocco @if può essere associato ad un blocco @else:
@if (loading) {
<p class="loader">Loading...</p>
} @else {
<section class="content">
Here's your content.
</section>
}
o ad un numero illimitato di blocchi @else if seguiti da un eventuale blocco @else finale:
@if (status === 'loading') {
<p class="loader">Loading...</p>
} @else if (status === 'error') {
<p class="error">Something went wrong.</p>
} @else {
<section class="content">
Here's your content.
</section>
}
@switch in Angular.
Nei casi in cui si debba usare un numero multiplo di @else if sulla stessa variabile, è preferibile utilizzare il blocco @switch, la cui sintassi è simile allo switch statement in linguaggio JavaScript:
@switch (status) {
@case ('loading') {
<p class="loading">Loading...</p>
}
@case ('error') {
<p class="error">Error!</p>
}
@case ('success') {
<section class="content">
Here's your content.
</section>
}
@default {
<p class="bug">State management is bugged.</p>
}
}
@for in Angular.
Come @if e @switch, anche @for è fortemente ispirato alla sintassi JavaScript for-of:
@for (num of [1, 2, 3]; track num) {
<p>{{num}}</p>
}
Accanto alla canonica formula variable_name of array abbiamo la keyword track seguita dall’espressione usata per distinguere gli elementi dell’array; nell’esempio usiamo il numero stesso, ma possiamo anche usare un id se stiamo ciclando su un array di oggetti:
@for (user of users$ | async; track user.id) {
<p>{{user.name}}</p>
}
In casi semplici in cui l’ordinamento dell’array è garantito, è possibile anche usare track $index, dove $index è una variabile di contesto spendibile all’interno del blocco:
@for (num of [1, 2, 3]; track $index) {
<p>{{num}} i {{$index}}</p>
}
Altre variabili di contesto disponibili sono:
- $count: number: numero di elementi iterati in una collezione,
- $index: number: indice dell’elemento attuale a partire da 0,
- $first: boolean: indica se l’elemento attuale è il primo,
- $last: boolean: indica se l’elemento attuale è l’ultimo,
- $even: boolean: indica se l’indice dell’elemento attuale è pari,
- $odd: boolean: indica se l’indice dell’elemento attuale è dispari.
È possibile assegnare un alias a queste variabili usando let:
@for (item of items; track item.id; let idx = $index) {
<p>#{{idx}} - {{item.name}}</p>
}
Un blocco @for può essere seguito da un blocco @empty il cui contenuto viene esposto nel caso in cui non vi siano elementi presenti, un po’ come se fosse un @else rispetto ad un if-statement:
@for (item of items; track item.id) {
<li>{{item.name}}</li>
} @empty {
<li>There are no items.</li>
}
CONTENUTI GRATUITI IN EVIDENZA
Guide per aspiranti programmatori 👨🏻🚀
Vuoi muovere i primi passi nel Digital e Tech? Abbiamo preparato alcune guide per aiutarti a orientarti negli ambiti più richiesti oggi.