Czy wiesz, do czego służy untracked w Angular?
W bibliotekach opartych na reaktywnych sygnałach, takich jak Angular Signals,
każda zmiana wartości sygnału używanego w funkcjach computed()
lub effect()
powoduje automatyczną rekalkulację lub ponowne wykonanie efektu.
Dzięki temu aplikacja utrzymuje spójny stan i dynamicznie reaguje na zmiany danych.
W niektórych sytuacjach jednak warto pobrać wartość sygnału bez uruchamiania reakcji.
Można to osiągnąć za pomocą funkcji untracked()
, która pozwala na odczyt wartości sygnału z pominięciem mechanizmu śledzenia zależności.
const signalA = signal(0);
const signalB = signal(1);
effect(() => {
console.log(signalA(), untracked(() => signalB()));
})
Powyższy kod wykona się ponownie tylko w przypadku aktualizacji wartości sygnału A.
W poniższym przykładzie untracked
został użyty w komponencie karuzeli kategorii:
@Component({
// (...)
template: `
<ul>
@for (category of categories(); track $index; let i = $index) {
<li [attr.row-id]="i" #category>
</li>
}
</ul>
`,
})
export class Categories {
// lista kategorii
categories: WritableSignal<string[]> = signal([
'wszystkie',
'ankieta',
'bezpieczenstwo',
'inne',
'marketing',
'monitoring',
'oferta',
'oplaty',
'oprocentowanie',
'regulaminy',
'reklamacje',
]);
// wybrana kategoria
selectedRow: WritableSignal<number> = signal(0);
}
Na karuzeli wyświetlają się poziomo kategorie, które są scrollowalne.
Dodanie scrollowania do wybranej kategorii, można dodać w ramach effect()
:
// (...)
export class Categories {
// (...)
viewChildrenCategories: Signal<ReadonlyArray<ElementRef>> =
viewChildren<ElementRef>('category');
constructor() {
effect(() => {
const selectedRow = this.selectedRow();
const selectedElement = untracked(() =>
this.viewChildrenCategories().find(
(element) =>
element.nativeElement.getAttribute('row-id') == selectedRow
)
);
selectedElement?.nativeElement.scrollIntoView({
behavior: 'smooth',
inline: 'center',
});
});
}
// (...)
}
Scroll zostanie wykonany jedynie w przypadku gdy selectedRow
zostanie zaktualizowany. Aktualizacja kategorii nie spowoduje przeskrollowania.
Przydatne linki
-
SENIOR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 14 900 - 20 590 PLN brutto
B2B 19 680 - 27 220 PLN netto -
REGULAR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 11 300 - 15 900 PLN brutto
B2B 14 950 - 21 000 PLN netto -
ZOBACZ WSZYSTKIE OGŁOSZENIA
newsletter
techniczny
-
SENIOR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 14 900 - 20 590 PLN brutto
B2B 19 680 - 27 220 PLN netto -
REGULAR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 11 300 - 15 900 PLN brutto
B2B 14 950 - 21 000 PLN netto -
ZOBACZ WSZYSTKIE OGŁOSZENIA