Skip to content

Commit 920c0ba

Browse files
kondibrandonroberts
authored andcommitted
fix(RouterStore): Fix cancelled navigation with async guard (fixes #354) (#355)
Closes #354 #201
1 parent 28e1983 commit 920c0ba

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ import {
1414
} from '../src/index';
1515
import 'rxjs/add/operator/filter';
1616
import 'rxjs/add/operator/first';
17+
import 'rxjs/add/operator/mapTo';
18+
import 'rxjs/add/operator/take';
1719
import 'rxjs/add/operator/toPromise';
20+
import { of } from 'rxjs/observable/of';
1821

1922
describe('integration spec', () => {
2023
it('should work', done => {
@@ -370,6 +373,38 @@ describe('integration spec', () => {
370373
});
371374
});
372375
});
376+
377+
it('should support event during an async canActivate guard', done => {
378+
createTestModule({
379+
reducers: { routerReducer },
380+
canActivate: () => {
381+
store.dispatch({ type: 'USER_EVENT' });
382+
return store.take(1).mapTo(true);
383+
},
384+
});
385+
386+
const router: Router = TestBed.get(Router);
387+
const store: Store<any> = TestBed.get(Store);
388+
const log = logOfRouterAndStore(router, store);
389+
390+
router
391+
.navigateByUrl('/')
392+
.then(() => {
393+
log.splice(0);
394+
return router.navigateByUrl('next');
395+
})
396+
.then(() => {
397+
expect(log).toEqual([
398+
{ type: 'router', event: 'NavigationStart', url: '/next' },
399+
{ type: 'router', event: 'RoutesRecognized', url: '/next' },
400+
{ type: 'store', state: undefined }, // after ROUTER_NAVIGATION
401+
{ type: 'store', state: undefined }, // after USER_EVENT
402+
{ type: 'router', event: 'NavigationEnd', url: '/next' },
403+
]);
404+
405+
done();
406+
});
407+
});
373408
});
374409

375410
function createTestModule(

modules/router-store/src/router_store_module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,8 @@ export class StoreRouterConnectingModule {
186186
private setUpStoreStateListener(): void {
187187
this.store.subscribe(s => {
188188
this.storeState = s;
189+
});
190+
this.store.select('routerReducer').subscribe(() => {
189191
this.navigateIfNeeded();
190192
});
191193
}

0 commit comments

Comments
 (0)