From 07e0fce8fc01368ad48f2a3103429bf417a8cfb1 Mon Sep 17 00:00:00 2001 From: Dzmitry Shylovich Date: Wed, 28 Dec 2016 02:57:22 +0300 Subject: [PATCH] fix(router): update route snapshot before emit new values (#13558) Closes #12912 --- modules/@angular/router/src/router_state.ts | 15 +++++++------ .../@angular/router/test/integration.spec.ts | 22 ++++++++++++++----- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/modules/@angular/router/src/router_state.ts b/modules/@angular/router/src/router_state.ts index cb9f22a39c..34f82d2d5c 100644 --- a/modules/@angular/router/src/router_state.ts +++ b/modules/@angular/router/src/router_state.ts @@ -328,22 +328,23 @@ function serializeNode(node: TreeNode): string { */ export function advanceActivatedRoute(route: ActivatedRoute): void { if (route.snapshot) { - if (!shallowEqual(route.snapshot.queryParams, route._futureSnapshot.queryParams)) { + const currentSnapshot = route.snapshot; + route.snapshot = route._futureSnapshot; + if (!shallowEqual(currentSnapshot.queryParams, route._futureSnapshot.queryParams)) { (route.queryParams).next(route._futureSnapshot.queryParams); } - if (route.snapshot.fragment !== route._futureSnapshot.fragment) { + if (currentSnapshot.fragment !== route._futureSnapshot.fragment) { (route.fragment).next(route._futureSnapshot.fragment); } - if (!shallowEqual(route.snapshot.params, route._futureSnapshot.params)) { + if (!shallowEqual(currentSnapshot.params, route._futureSnapshot.params)) { (route.params).next(route._futureSnapshot.params); } - if (!shallowEqualArrays(route.snapshot.url, route._futureSnapshot.url)) { + if (!shallowEqualArrays(currentSnapshot.url, route._futureSnapshot.url)) { (route.url).next(route._futureSnapshot.url); } - if (!equalParamsAndUrlSegments(route.snapshot, route._futureSnapshot)) { + if (!equalParamsAndUrlSegments(currentSnapshot, route._futureSnapshot)) { (route.data).next(route._futureSnapshot.data); } - route.snapshot = route._futureSnapshot; } else { route.snapshot = route._futureSnapshot; @@ -356,4 +357,4 @@ export function advanceActivatedRoute(route: ActivatedRoute): void { export function equalParamsAndUrlSegments( a: ActivatedRouteSnapshot, b: ActivatedRouteSnapshot): boolean { return shallowEqual(a.params, b.params) && equalSegments(a.url, b.url); -} \ No newline at end of file +} diff --git a/modules/@angular/router/test/integration.spec.ts b/modules/@angular/router/test/integration.spec.ts index a0480b8827..a251df2685 100644 --- a/modules/@angular/router/test/integration.spec.ts +++ b/modules/@angular/router/test/integration.spec.ts @@ -551,13 +551,17 @@ describe('Integration', () => { const user = fixture.debugElement.children[1].children[1].componentInstance; expect(team.recordedParams).toEqual([{id: '22'}]); + expect(team.snapshotParams).toEqual([{id: '22'}]); expect(user.recordedParams).toEqual([{name: 'victor'}]); + expect(user.snapshotParams).toEqual([{name: 'victor'}]); router.navigateByUrl('/team/22/user/fedor'); advance(fixture); expect(team.recordedParams).toEqual([{id: '22'}]); + expect(team.snapshotParams).toEqual([{id: '22'}]); expect(user.recordedParams).toEqual([{name: 'victor'}, {name: 'fedor'}]); + expect(user.snapshotParams).toEqual([{name: 'victor'}, {name: 'fedor'}]); }))); it('should work when navigating to /', fakeAsync(inject([Router], (router: Router) => { @@ -2777,11 +2781,15 @@ class BlankCmp { class TeamCmp { id: Observable; recordedParams: Params[] = []; + snapshotParams: Params[] = []; routerLink = ['.']; constructor(public route: ActivatedRoute) { this.id = map.call(route.params, (p: any) => p['id']); - route.params.forEach(_ => this.recordedParams.push(_)); + route.params.forEach(p => { + this.recordedParams.push(p); + this.snapshotParams.push(route.snapshot.params); + }); } } @@ -2797,10 +2805,14 @@ class TwoOutletsCmp { class UserCmp { name: Observable; recordedParams: Params[] = []; + snapshotParams: Params[] = []; constructor(route: ActivatedRoute) { this.name = map.call(route.params, (p: any) => p['name']); - route.params.forEach(_ => this.recordedParams.push(_)); + route.params.forEach(p => { + this.recordedParams.push(p); + this.snapshotParams.push(route.snapshot.params); + }); } } @@ -2923,7 +2935,7 @@ function createRoot(router: Router, type: any): ComponentFixture { RootCmp, RelativeLinkInIfCmp, RootCmpWithTwoOutlets, - EmptyQueryParamsCmp + EmptyQueryParamsCmp, ], @@ -2949,7 +2961,7 @@ function createRoot(router: Router, type: any): ComponentFixture { RootCmp, RelativeLinkInIfCmp, RootCmpWithTwoOutlets, - EmptyQueryParamsCmp + EmptyQueryParamsCmp, ], @@ -2976,7 +2988,7 @@ function createRoot(router: Router, type: any): ComponentFixture { RootCmp, RelativeLinkInIfCmp, RootCmpWithTwoOutlets, - EmptyQueryParamsCmp + EmptyQueryParamsCmp, ] }) class TestModule {