Каков предполагаемый способ использования вычисленных сигналов вместе с селекторами ngrx и где разместить логику?
Я использую Angular 16 и только начал с сигналов. Это делает работу с ngrx еще лучше. При переходе я обнаружил, что передо мной нечто, что можно абстрагировать до этого:
const state = {
someArray: [1, 5, 7]
}
export const selectArray = createSelector(
state,
(state) => state.someArray
);
export const selectFirst = createSelector(
selectArray,
(someArray) => someArray[0]
);
export const selectLast = createSelector(
selectArray,
(someArray) => someArray[state.someArray.length-1]
);
export const selectLastMinusFirst = createSelector(
[selectFirst, selectLast],
(first, last) =>
last - first
);
Теперь с сигналами это можно переписать, используя вычисленные сигналы в компоненте, который хочет их использовать, примерно так:
const someArray: Signal<number[]> = this.store.selectSignal(Selectors.SelectArray)
const first: Signal<number> = computed(() => someArray()[0]);
const last: Signal<number> = computed(() => someArray()[state.someArray.length-1]);
const lastMinusFirst: Signal<number> = computed(() => last() - first());
Или даже используя эффекты сигналов:
const first = 0;
const last = 0;
const lastMinusFirst = 0;
const someArray: Signal<number[]> = this.store.selectSignal(Selectors.SelectArray)
constructor() {
effect(() => {
if(someArray().length) {
this.first = someArray()[0];
this.last = someArray()[someArray().length - 1];
this.lastMinusFirst = this.last - this.first;
}
});
}
Каков предполагаемый способ сделать это? Являются ли вычисленные сигналы более эффективными, если в них упоминаются ленивые вычисления и запоминаются?
1 ответ
лучше, чем селектор, потому что
- Его зависимости являются динамическими [1];
- Полученный сигнал можно использовать непосредственно в шаблоне, и он позаботится об обнаружении изменений без необходимости
|async
или грязная проверка; - Зависимости рекурсивны – если внутри
computed()
вы вызываете некоторую функцию, которая также использует сигналы, тогда результирующий сигнал будет обновляться при обновлении сигнала в этой функции. И это может произойти где-то глубоко в стеке, если это происходит синхронно [2]. Это позволяет создавать очень гибкие и мощные вещи — производные сигналы, состоящие из производных сигналов.
Тем временем NgRx работает над интеграцией с Angular Signals:
[1], [2] — Вы можете прочитать больше об этой теме в моей бесплатной статье: Граф зависимостей в угловых сигналах.