Angular's linkedSignal gives you more control over reactive updates. Let's take a look at what it is, how it's different from computed signals, and when to use it.
Angular's linkedSignal: A New Level of Control
Angular's reactive programming model continues to evolve, and with Angular 19+, we now have linkedSignal
as an addition to the signal ecosystem. But what exactly is a linkedSignal
, and how does it differ from the already existing computed
signal? Let's look at this feature in detail and understand the differences.
What Is a linkedSignal?
A linkedSignal
is a reactive construct in Angular that connects a signal's value to a function while allowing explicit control over when and how the value is recomputed. Unlike a computed
signal, which automatically recalculates its value whenever a dependency changes, a linkedSignal
requires a manual trigger for updates. This distinction gives developers more control over performance and behavior in scenarios where automatic recalculation might not be ideal.
Think of linkedSignal
as a middle ground between fully reactive signals and completely manual state management, offering both flexibility and precision.
How Is It Different from a computed Signal?
Here is a side-by-sude comparison of some key differences between linkedSignal
and computed
signal:
computed | linkedSignal | |
---|---|---|
Recalculation Trigger | Automatic (based on dependency changes) | Manual (requires explicit updates) |
Use Case | For deriving values that always stay in sync | For controlled updates in performance-critical scenarios |
Flexibility | Less flexible, always reactive | More flexible, can react when necessary |
Performance Control | Less control (potentially recalculates often) | Full control over recalculations |
With linkedSignal
, you gain the ability to balance reactivity and performance more effectively, making it ideal for complex, performance-sensitive applications.
Use Cases for linkedSignal
Here are two practical scenarios where linkedSignal
shines:
1. Debounced Input Handling
Imagine you’re building a search input where each keystroke triggers an expensive API call. Using a computed
signal might lead to excessive recalculations as the user types. Instead, you can use a linkedSignal
to debounce the updates, ensuring the API call is triggered only after a user pauses typing.
import { signal, linkedSignal, effect } from "@angular/core";
const searchQuery = signal("");
const debouncedSearch = linkedSignal(() => searchQuery());
function updateDebouncedSearch(value: string) {
searchQuery.set(value);
setTimeout(() => {
debouncedSearch.update();
}, 300); // Trigger recalculation after 300ms debounce
}
effect(() => {
const query = debouncedSearch();
if (query) {
console.log(`Performing search for: ${query}`);
}
});
Here, debouncedSearch
recalculates only when updateDebouncedSearch
explicitly triggers an update, avoiding unnecessary API calls and improving application performance.
2. Lazy Data Loading in Complex UIs
In some cases, especially when working with complex user interfaces with several tabs or panels, you may not want to load data for inactive sections until the user navigates to them. A linkedSignal
allows you to link data loading to a UI interaction explicitly.
import { signal, linkedSignal } from "@angular/core";
const activeTab = signal("overview");
const tabData = linkedSignal(() => {
switch (activeTab()) {
case "overview":
return fetchOverviewData();
case "details":
return fetchDetailsData();
default:
return null;
}
});
function loadTabData(tab: string) {
activeTab.set(tab);
tabData.update(); // Explicitly trigger data loading
}
// Simulating data fetching functions
function fetchOverviewData() {
return { content: "Overview Content" };
}
function fetchDetailsData() {
return { content: "Details Content" };
}
This approach ensures that data is fetched only when the user activates a tab, optimizing both network usage, computational costs and bundle size.
Conclusion
The introduction of linkedSignal
in Angular’s reactive toolkit empowers developers with fine-grained control over signal updates. While computed
signals are great for automatic derivations, linkedSignal
is the go-to solution for scenarios where performance and explicit control are important. Whether you're optimizing for debounced updates or managing lazy-loaded components, linkedSignal
provides a clean and effective approach.