24. Router store

In this section we will use NgRx's router store library to listen to url or router events as actions in our effects.

1. npm i @ngrx/router-store

npm i @ngrx/router-store

2. Add to AppModule

  • Add StoreRouterConnectingModule to the AppModule.

  • Often it is needed to create your own router serilaizer but we will skip this step.

src/app/app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { RouterModule } from '@angular/router';
import { HttpClientInMemoryWebApiModule } from 'angular-in-memory-web-api';
import { StoreModule } from '@ngrx/store';
import { StoreDevtoolsModule } from '@ngrx/store-devtools';
import { EffectsModule } from '@ngrx/effects';
import { StoreRouterConnectingModule } from '@ngrx/router-store';

import { HomeComponent } from './home/containers/home/home.component';
import { AppComponent } from './app.component';
import { InMemoryDataService } from './app.db';
import { reducer } from './state/spinner/spinner.reducer';
import { environment } from '../environments/environment.prod';

@NgModule({
  declarations: [AppComponent, HomeComponent],
  imports: [
    BrowserModule,
    RouterModule.forRoot([
      { path: '', pathMatch: 'full', redirectTo: 'home' },
      { path: 'home', component: HomeComponent },
      { path: 'event', loadChildren: './event/event.module#EventModule' }
    ]),
    HttpClientModule,
    HttpClientInMemoryWebApiModule.forRoot(InMemoryDataService, {
      delay: 1000
    }),
    StoreModule.forRoot({ spinner: reducer }),
    EffectsModule.forRoot([]),
    StoreDevtoolsModule.instrument({
      name: 'NgRx Demo App',
      logOnly: environment.production
    }),
    StoreRouterConnectingModule.forRoot(),
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {}

Image: Showing router events as actions in the devtools

3. Add a select box to EventComponent to update URL

  • Add select box element.

4. Add navigate method to component

  • Add a navigate method to the component to update the URL.

  • Delete dispatched LoadAttendees action.

5. Add next action creator for filterBy property

  • Add new AttendeesActionTypes for FilterBy.

  • Add new class for FilterBy

  • Add new AttendeesActions for FilterBy.

6. Add an effect to listen to router events

  • Add an effect listening to RouterEvents that begin with /events.

7. Update reducer to have new filterBy

  • Add switch case to set filterBy property.

8. Add new selector for filtering attendees.

  • Add selector to get filterBY state property.

  • Use two getAttendees and getFilterBy to filter the list.

9. Use new selector in EventComponent

  • Swap getAttendees selector for getFilteredAttendees selector.

Web Link: Link to the demo app running in StackBlitz

Last updated