Which to use StoreModule.forRoot or StoreModule.forFeature?

Discussão em 'Angular' iniciado por user11472365, Abril 14, 2025.

  1. user11472365

    user11472365 Guest

    I was reading about and they said that .forRoot merges all the reducers, and when manipulating the state in this way you are manipulating all the reducers at once.

    Soon .forFeature allows you to manipulate each reducer as if it had a state for each one.

    And I would like to know the following:

    1) Is this true?

    2) How to use .forFeature() with multiple reducers?

    I'm getting the following error:

    NullInjectorError: R3InjectorError(AppModule)[StoreFeatureModule -> ReducerManager -> ReducerManager -> ReducerManager]:
    NullInjectorError: No provider for ReducerManager!


    MODULE

    import { BrowserModule } from '@angular/platform-browser';
    import { NgModule } from '@angular/core';
    import { HttpClientModule } from '@angular/common/http';

    import { environment } from 'environments/environment';
    import { StoreModule } from '@ngrx/store';
    import { EffectsModule } from '@ngrx/effects';
    import { StoreDevtoolsModule } from '@ngrx/store-devtools';
    import { STORE_REDUCERS, STORE_EFFECTS } from './store';

    import { AppComponentModule } from '@app/components/app-component.module';
    import { AppComponent } from './app.component';

    @NgModule({
    declarations: [AppComponent],
    imports: [
    BrowserModule,
    AppComponentModule,
    HttpClientModule,
    StoreDevtoolsModule.instrument({ maxAge: 25, logOnly: !environment.production }),
    StoreModule.forFeature('people', STORE_REDUCERS),
    EffectsModule.forFeature(STORE_EFFECTS),
    ],
    providers: [],
    bootstrap: [AppComponent],
    })
    export class AppModule {}


    PEOPLE SELECTOR

    import { createFeatureSelector, createSelector } from '@ngrx/store';
    import { State, adapter } from './people.reducer';

    const featureSelector = createFeatureSelector<State>('people');

    export const { selectIds, selectEntities, selectAll, selectTotal } = adapter.getSelectors(featureSelector);

    export const getLoading = createSelector(featureSelector, ({ loading }) => loading);
    export const getError = createSelector(featureSelector, ({ error }) => error);
    export const getMain = createSelector(selectAll, (peoples) => peoples.filter((people) => people.isMain)[0]);


    STORE INDEX:

    import { ActionReducerMap } from '@ngrx/store';
    import * as fromPeopleReducer from './people/people.reducer';
    import * as fromPeopleEffects from './people/people.effects';

    export interface StoreState {
    people: fromPeopleReducer.State;
    }

    export const STORE_REDUCERS: ActionReducerMap<StoreState> = {
    people: fromPeopleReducer.reducer,
    };

    export const STORE_EFFECTS: any[] = [fromPeopleEffects.Effects];

    Continue reading...

Compartilhe esta Página