← Angular コース
60. linkedSignal — 連動して作り直せる書き込み可能な状態
computed は依存するシグナルから自動で計算される便利な仕組みでしたが、読み取り専用で、外から値を上書きすることはできません。ところが実務では「基本は他のシグナルから決まるが、ユーザーの操作で上書きもしたい」という状態がよく出てきます。たとえば商品リストの「選択中の商品」です。リストが切り替わったら選択は先頭に戻したい、でもユーザーがリストの中から自由に選び直せてほしい。この両立を担うのが linkedSignal です。
使い方は computed とよく似ていて、linkedSignal(() => this.items()[0]) のように計算式を渡します。依存している items が変わるたびに計算し直される点は computed と同じですが、linkedSignal が返すのは書き込み可能なシグナル(WritableSignal)なので、selected.set(item) で上書きできます。上書きした値は、次に依存が変わって計算し直されるまで保持されます。
同じことを signal と effect の組み合わせで書こうとすると、「effect の中で set する」という追いかけづらいコードになりがちです。linkedSignal は「リセット条件つきの書き込み可能な状態」という1つの概念を、1つの部品として素直に表現できます。computed(派生値・読み取り専用)と signal(独立した状態・書き込み可能)の中間がほしくなったら、linkedSignal を思い出してください。
サンプルコード(フレームワーク環境が必要なため表示のみ)
import { Component, signal, linkedSignal } from '@angular/core';
@Component({
selector: 'app-product-picker',
template:
'@for (p of products(); track p) {' +
' <button (click)="selected.set(p)">{{ p }}</button>' +
'}' +
'<p>選択中: {{ selected() }}</p>',
})
export class ProductPickerComponent {
products = signal(['りんご', 'みかん', 'ぶどう']);
// 基本は products の先頭。products が変われば先頭に戻る。
// でも set() でユーザーの選択に上書きもできる。
selected = linkedSignal(() => this.products()[0]);
}
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗