Skip to content

Commit 48305aa

Browse files
dummdidummbrandonroberts
authored andcommitted
fix(RouterStore): Reset dispatch-tracking booleans after navigation end (#968)
1 parent b99d9ff commit 48305aa

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

modules/router-store/spec/integration.spec.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,55 @@ describe('integration spec', () => {
521521
done();
522522
});
523523
});
524+
525+
it('should continue to react to navigation after state initiates router change', (done: Function) => {
526+
const reducer = (state: any = { state: { url: '/' } }, action: any) => {
527+
if (action.type === ROUTER_NAVIGATION) {
528+
return { state: { url: action.payload.routerState.url.toString() } };
529+
} else {
530+
return state;
531+
}
532+
};
533+
534+
createTestModule({
535+
reducers: { reducer },
536+
config: { stateKey: 'reducer' },
537+
});
538+
539+
const router: Router = TestBed.get(Router);
540+
const store = TestBed.get(Store);
541+
const log = logOfRouterAndStore(router, store);
542+
543+
store.dispatch({ type: ROUTER_NAVIGATION, payload: {routerState: {url: '/next'}} });
544+
waitForNavigation(router)
545+
.then(() => {
546+
router.navigate(['/']);
547+
return waitForNavigation(router);
548+
})
549+
.then(() => {
550+
expect(log).toEqual([
551+
{ type: 'store', state: { state: { url: '/' } } },
552+
{ type: 'router', event: 'NavigationStart', url: '/next' },
553+
{ type: 'store', state: { state: { url: '/next' } } },
554+
{ type: 'router', event: 'RoutesRecognized', url: '/next' },
555+
{ type: 'router', event: 'GuardsCheckStart', url: '/next' },
556+
{ type: 'router', event: 'GuardsCheckEnd', url: '/next' },
557+
{ type: 'router', event: 'ResolveStart', url: '/next' },
558+
{ type: 'router', event: 'ResolveEnd', url: '/next' },
559+
{ type: 'router', event: 'NavigationEnd', url: '/next' },
560+
{ type: 'router', event: 'NavigationStart', url: '/' },
561+
{ type: 'router', event: 'RoutesRecognized', url: '/' },
562+
{ type: 'store', state: { state: { url: '/' } } },
563+
{ type: 'router', event: 'GuardsCheckStart', url: '/' },
564+
{ type: 'router', event: 'GuardsCheckEnd', url: '/' },
565+
{ type: 'router', event: 'ResolveStart', url: '/' },
566+
{ type: 'router', event: 'ResolveEnd', url: '/' },
567+
{ type: 'router', event: 'NavigationEnd', url: '/' }
568+
]);
569+
done();
570+
});
571+
572+
});
524573
});
525574

526575
function createTestModule(

modules/router-store/src/router_store_module.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
import {
88
NavigationCancel,
99
NavigationError,
10+
NavigationEnd,
1011
Router,
1112
RouterStateSnapshot,
1213
RoutesRecognized,
@@ -248,8 +249,9 @@ export class StoreRouterConnectingModule {
248249
routerState: RouterStateSnapshot
249250
) => {
250251
this.routerState = this.serializer.serialize(routerState);
251-
if (this.shouldDispatchRouterNavigation())
252+
if (this.shouldDispatchRouterNavigation()) {
252253
this.dispatchRouterNavigation();
254+
}
253255
return of(true);
254256
};
255257
}
@@ -291,6 +293,9 @@ export class StoreRouterConnectingModule {
291293
this.dispatchRouterCancel(e);
292294
} else if (e instanceof NavigationError) {
293295
this.dispatchRouterError(e);
296+
} else if (e instanceof NavigationEnd) {
297+
this.dispatchTriggeredByRouter = false;
298+
this.navigationTriggeredByDispatch = false;
294299
}
295300
});
296301
}

0 commit comments

Comments
 (0)