Passa al contenuto principale

Signals

I Signals sono il meccanismo di reattività nativo di Angular. Vanno preferiti a BehaviorSubject e al two-way binding per gestire lo stato visualizzato nel template.

Regola: wrappare sempre con un Signal tutto ciò che si mostra nel template. Garantisce change detection granulare e performante.

Uso base

import { signal, computed } from '@angular/core';

// Stato reattivo
readonly count = signal(0);

// Valore derivato
readonly double = computed(() => this.count() * 2);

// Aggiornamento
increment() {
this.count.update(v => v + 1);
}

Computed signals

readonly firstName = signal('Mario');
readonly lastName = signal('Rossi');
readonly fullName = computed(() => `${this.firstName()} ${this.lastName()}`);

Conversione da Observable

Per flussi asincroni (HTTP, WebSocket) gli Observable RxJS restano validi. Convertire in Signal quando servono nel template:

import { toSignal } from '@angular/core/rxjs-interop';

private readonly http = inject(HttpClient);
readonly users = toSignal(this.http.get<User[]>('/api/users'), { initialValue: [] });

Effect

Per eseguire side-effect quando un signal cambia:

effect(() => {
console.log('Count changed:', this.count());
});

Nel template

<p>{{ count() }}</p>
<p>{{ fullName() }}</p>