Angular: computed vs linkedSignal

Veja as diferenças entre o computed e linkedSignal que fazem parte do novo sistema de reatividade do Angular, o Signals.

Imagem predominantemente preta, com o título "Diferença entre computed e linkedSignal"
Diferença entre computed e linkedSignal do Angular

Desde 2023 os Signals são o novo sistema de reatividade adotado pelo Angular. Inclusive foi um tema abordado por aqui:

Introdução ao Angular Signals
Ainda em developer preview, Angular Signals é um novo recurso que pode mudar o atual sistema de detecção de mudanças do Angular. Criando “pacote” ao redor de um valor e pode notificar consumidores interessados nas mudanças do valor. Conheça os motivadores e veja alguns exemplos neste post

O propósito dos Signals é servir como base para o framework Angular identificar quando algo muda, por exemplo, quando o estado de um componente é atualizado e o Angular precisa executar o fluxo de detecção de mudanças.

Como funciona o Change Detection do Angular
Veja como funciona o change detection (CD) do Angular e qual a melhor estratégia para o seu componente: Default ou OnPush.

Com base nos Signals, o Angular consegue manter sincronizados os dados do componente com o template (a parte HTML), sem depender do Zone.js para detectar essas alterações.


Gravei um video falando sobre o change detector com o Zone.js e o Zoneless do Angular:


Com a introdução dos Signals, o framework disponibilizou o computed. Ele funciona como um valor calculado que depende de outros Signals e lembra um getter. Sempre que algum desses Signals muda, o computed é reavaliado automaticamente. Para quem tem experiência com banco de dados, é parecido com uma View, já que consolida informações e reage às alterações nas tabelas (no caso do Angular não são tabelas, mas sim os Signals).

import {
  Component, computed, linkedSignal, signal
} from "@angular/core";
import { FormsModule } from "@angular/forms";

@Component({
  selector: "app-linkedsignal",
  imports: [FormsModule],
  templateUrl: "linkedsignal.html",
})
export class Linkedsignal {
  protected readonly protocolo = signal("https");
  protected readonly endereco = signal("consolelog.com.br");

  protected readonly resultadoComputed = computed(
    () => this.protocolo() + "://" + this.endereco(),
  );

  protected readonly resultadoLinkedSignal = linkedSignal(
    () => this.protocolo() + "://" + this.endereco(),
  );
}

Exemplo do uso do computed e linkedSignal

 <div class="container-fluid mt-3">
  <div class="row">
    <div class="col">
      <div class="d-flex mb-4 gap-3">
        <div class="flex-grow-1">
          <label for="inputProtocolo" class="form-label">
            Protocolo
          </label>
          <input
            (ngModelChange)="protocolo.set($event)"
            [ngModel]="protocolo()"
            class="form-control"
            id="inputProtocolo"
            type="text"
          />
        </div>

        <div class="flex-grow-1">
          <label class="form-label" for="inputEndereco">
            Endereço
          </label>
          <input
            (ngModelChange)="endereco.set($event)"
            [ngModel]="endereco()"
            class="form-control"
            id="inputEndereco"
            type="text"
          />
        </div>
      </div>
      <div class="mb-3">
        <label for="inputComputed" class="form-label">
          Computed (readonly)
        </label>
        <input
          type="text"
          class="form-control text-secondary"
          id="inputComputed"
          readonly
          [value]="resultadoComputed()"
        />

        <br />
        Valor <code>resultadoComputed()</code>:
        <strong>{{ resultadoComputed() }}</strong>
      </div>
      <div class="mb-3">
        <label for="inputLinkedSignal" class="form-label">
          LinkedSignal
        </label>
        <input
          (ngModelChange)="resultadoLinkedSignal.set($event)"
          [ngModel]="resultadoLinkedSignal()"
          class="form-control"
          id="inputLinkedSignal"
          type="text"
        />
        <br />
        Valor <code>resultadoLinkedSignal()</code>:
        <strong>{{ resultadoLinkedSignal() }}</strong>
      </div>
    </div>
  </div>
</div>

Template do componente

Já o linkedSignal é muito parecido com o computed. A diferença é que o computed não pode ser modificado diretamente, ou seja, ele só fornece os valores com base nas mudanças dos seus Signals. O linkedSignal tem esse comportamento, porém pode aceitar atualizações manuais, permitindo cenários mais flexíveis.

0:00
/0:25

Resultado do componente em execução no navegador

CTA Image

Curso rápido e objetivo de Angular para iniciantes. Aprenda a criar projetos práticos e domine os conceitos essenciais do framework para acelerar sua jornada como desenvolvedor.

Começar agora mesmo!

Considerações

O computed e linkedSignal a princípio podem parecer ser iguais, mas a grande diferença está na capacidade do linkedSignal pode receber valores de forma manual além de reagir as mudanças de outros Signals.

Links interessantes:

Video postado no YouTube sobre esse assunto: