Angular

What is LinkedSignal for Bidirectional Reactivity?

March 18, 2026

download ready
Thank You
Your submission has been received.
We will be in touch and contact you soon!

LinkedSignal is an advanced Angular signal primitive that creates writable signals intrinsically linked to source signals. Unlike computed() (read-only), LinkedSignal allows direct .set() and .update() while automatically maintaining valid values based on its source signals when they change.

Code Example:-

Code

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

@Component({
  template: `
    <select [value]="selectedOption()?.name" (change)="changeOption($event)">
      @for (opt of options(); track opt.id) {
        <option [value]="opt.name">{{ opt.name }}</option>
      }
    </select>
    <p>Selected: {{ selectedOption()?.name }}</p>
  `
})
export class ShippingSelector {
  options = signal([
    { id: 0, name: 'Ground' },
    { id: 1, name: 'Air' },
    { id: 2, name: 'Sea' }
  ]);

  // LinkedSignal auto-resets to first valid option if source changes
  selectedOption = linkedSignal({
    source: this.options,
    computation: (options, previous) => {
      // Preserve previous selection if still valid
      return options.find(opt => opt.id === previous?.id) || options[0];
    }
  });

  changeOption(event: Event) {
    const name = (event.target as HTMLSelectElement).value;
    this.selectedOption.set(this.options().find(opt => opt.name === name)!);
  }
}
      
Hire Now!

Need Help with Angular Development ?

Work with our skilled angular developers to accelerate your project and boost its performance.
**Hire now**Hire Now**Hire Now**Hire now**Hire now

What is LinkedSignal for Bidirectional Reactivity?

LinkedSignal is an advanced Angular signal primitive that creates writable signals intrinsically linked to source signals. Unlike computed() (read-only), LinkedSignal allows direct .set() and .update() while automatically maintaining valid values based on its source signals when they change.

Code Example:-

Code

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

@Component({
  template: `
    <select [value]="selectedOption()?.name" (change)="changeOption($event)">
      @for (opt of options(); track opt.id) {
        <option [value]="opt.name">{{ opt.name }}</option>
      }
    </select>
    <p>Selected: {{ selectedOption()?.name }}</p>
  `
})
export class ShippingSelector {
  options = signal([
    { id: 0, name: 'Ground' },
    { id: 1, name: 'Air' },
    { id: 2, name: 'Sea' }
  ]);

  // LinkedSignal auto-resets to first valid option if source changes
  selectedOption = linkedSignal({
    source: this.options,
    computation: (options, previous) => {
      // Preserve previous selection if still valid
      return options.find(opt => opt.id === previous?.id) || options[0];
    }
  });

  changeOption(event: Event) {
    const name = (event.target as HTMLSelectElement).value;
    this.selectedOption.set(this.options().find(opt => opt.name === name)!);
  }
}