From 38bce8845b881be33114606cf375662e1b4cce2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Maniecki?= <969645+P4@users.noreply.github.com> Date: Mon, 28 Mar 2022 15:39:21 +0200 Subject: [PATCH] fix(component-store): memoization not working when passing selectors directly to select (#3356) --- .../spec/component-store.spec.ts | 18 ++++++++++++++++++ modules/component-store/src/component-store.ts | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/modules/component-store/spec/component-store.spec.ts b/modules/component-store/spec/component-store.spec.ts index 8afdf66fd3..2aaa3f54e9 100644 --- a/modules/component-store/spec/component-store.spec.ts +++ b/modules/component-store/spec/component-store.spec.ts @@ -23,6 +23,7 @@ import { delay, concatMap, } from 'rxjs/operators'; +import { createSelector } from '@ngrx/store'; describe('Component Store', () => { describe('initialization', () => { @@ -895,6 +896,23 @@ describe('Component Store', () => { componentStore.ngOnDestroy(); }); + + it('supports memoization with createSelector', () => { + const projectorCallback = jest.fn((str: string) => str); + const memoizedSelector = createSelector( + (s: State) => s.value, + projectorCallback + ); + const selector = componentStore.select(memoizedSelector); + + // first call to memoizedSelector + const subscription = selector.subscribe(); + // second call to memoizedSelector with the same value + componentStore.setState(INIT_STATE); + + subscription.unsubscribe(); + expect(projectorCallback).toHaveBeenCalledTimes(1); + }); }); describe('selector with debounce', () => { diff --git a/modules/component-store/src/component-store.ts b/modules/component-store/src/component-store.ts index f606242657..a11bb689a6 100644 --- a/modules/component-store/src/component-store.ts +++ b/modules/component-store/src/component-store.ts @@ -244,7 +244,7 @@ export class ComponentStore implements OnDestroy { if (observables.length === 0) { observable$ = this.stateSubject$.pipe( config.debounce ? debounceSync() : (source$) => source$, - map(projector) + map((state) => projector(state)) ); } else { // If there are multiple arguments, then we're aggregating selectors, so we need