|
1 |
| -import { ChangeDetectorRef, Injectable } from '@angular/core'; |
| 1 | +import { ChangeDetectorRef, Injectable, OnDestroy } from '@angular/core'; |
2 | 2 | import { RxState } from '@rx-angular/state';
|
3 |
| -import { combineLatest, MonoTypeOperatorFunction, Observable, startWith, tap } from 'rxjs'; |
| 3 | +import { combineLatest, distinctUntilChanged, MonoTypeOperatorFunction, Observable, startWith, tap } from 'rxjs'; |
4 | 4 | import type { NgtAnyRecord } from '../types';
|
5 | 5 | import { is } from '../utils/is';
|
6 | 6 |
|
@@ -70,10 +70,10 @@ export function tapEffect<TValue>(effectFn: EffectFn<TValue>): MonoTypeOperatorF
|
70 | 70 | }
|
71 | 71 |
|
72 | 72 | @Injectable()
|
73 |
| -export class NgtRxStore< |
74 |
| - TState extends object = any, |
75 |
| - TRxState extends object = TState & Record<string, any> |
76 |
| -> extends RxState<TRxState> { |
| 73 | +export class NgtRxStore<TState extends object = any, TRxState extends object = TState & Record<string, any>> |
| 74 | + extends RxState<TRxState> |
| 75 | + implements OnDestroy |
| 76 | +{ |
77 | 77 | constructor() {
|
78 | 78 | super();
|
79 | 79 | // set a dummy property so that initial this.get() won't return undefined
|
@@ -120,4 +120,28 @@ export class NgtRxStore<
|
120 | 120 | requestAnimationFrame(() => void cdr.detectChanges());
|
121 | 121 | });
|
122 | 122 | }
|
| 123 | + |
| 124 | + private cache: Record<string, Observable<any>> = {}; |
| 125 | + key$<K extends keyof TRxState>(key: K): Observable<TRxState[K]>; |
| 126 | + key$<K1 extends keyof TRxState, K2 extends keyof TRxState[K1]>(key1: K1, key2: K2): Observable<TRxState[K1][K2]>; |
| 127 | + key$<K1 extends keyof TRxState, K2 extends keyof TRxState[K1], K3 extends keyof TRxState[K1][K2]>( |
| 128 | + key1: K1, |
| 129 | + key2: K2, |
| 130 | + key3: K3 |
| 131 | + ): Observable<TRxState[K1][K2][K3]>; |
| 132 | + key$(...keys: string[]) { |
| 133 | + const key = keys.join('.'); |
| 134 | + if (!this.cache[key]) { |
| 135 | + this.cache[key] = this.select(...(keys as [any])).pipe( |
| 136 | + startWith(this.get(...(keys as [any])) ?? undefined), |
| 137 | + distinctUntilChanged() |
| 138 | + ); |
| 139 | + } |
| 140 | + return this.cache[key]; |
| 141 | + } |
| 142 | + |
| 143 | + override ngOnDestroy() { |
| 144 | + this.cache = {}; |
| 145 | + super.ngOnDestroy(); |
| 146 | + } |
123 | 147 | }
|
0 commit comments