Skip to content

Commit 4b87be0

Browse files
committed
fix: add key$ to select observable from RxStore
1 parent f549985 commit 4b87be0

File tree

1 file changed

+30
-6
lines changed

1 file changed

+30
-6
lines changed

libs/angular-three/src/lib/stores/rx-store.ts

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { ChangeDetectorRef, Injectable } from '@angular/core';
1+
import { ChangeDetectorRef, Injectable, OnDestroy } from '@angular/core';
22
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';
44
import type { NgtAnyRecord } from '../types';
55
import { is } from '../utils/is';
66

@@ -70,10 +70,10 @@ export function tapEffect<TValue>(effectFn: EffectFn<TValue>): MonoTypeOperatorF
7070
}
7171

7272
@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+
{
7777
constructor() {
7878
super();
7979
// set a dummy property so that initial this.get() won't return undefined
@@ -120,4 +120,28 @@ export class NgtRxStore<
120120
requestAnimationFrame(() => void cdr.detectChanges());
121121
});
122122
}
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+
}
123147
}

0 commit comments

Comments
 (0)