feat(Router): call resolver when upstream params change (#12942)
With this change the resolver is called when the parameter for the activated and any parent routes change. ie, switching from `/teams/10/players/5` to `/teams/12/players/5` will now trigger any `PlayerResolver`.
This commit is contained in:
parent
46cb04d575
commit
d4d3782d45
|
@ -356,5 +356,9 @@ export function advanceActivatedRoute(route: ActivatedRoute): void {
|
||||||
|
|
||||||
export function equalParamsAndUrlSegments(
|
export function equalParamsAndUrlSegments(
|
||||||
a: ActivatedRouteSnapshot, b: ActivatedRouteSnapshot): boolean {
|
a: ActivatedRouteSnapshot, b: ActivatedRouteSnapshot): boolean {
|
||||||
return shallowEqual(a.params, b.params) && equalSegments(a.url, b.url);
|
const equalUrlParams = shallowEqual(a.params, b.params) && equalSegments(a.url, b.url);
|
||||||
|
const parentsMismatch = !a.parent !== !b.parent;
|
||||||
|
|
||||||
|
return equalUrlParams && !parentsMismatch &&
|
||||||
|
(!a.parent || equalParamsAndUrlSegments(a.parent, b.parent));
|
||||||
}
|
}
|
|
@ -100,9 +100,28 @@ describe('RouterState & Snapshot', () => {
|
||||||
|
|
||||||
describe('equalParamsAndUrlSegments', () => {
|
describe('equalParamsAndUrlSegments', () => {
|
||||||
function createSnapshot(params: Params, url: UrlSegment[]): ActivatedRouteSnapshot {
|
function createSnapshot(params: Params, url: UrlSegment[]): ActivatedRouteSnapshot {
|
||||||
return new ActivatedRouteSnapshot(
|
const snapshot = new ActivatedRouteSnapshot(
|
||||||
url, params, <any>null, <any>null, <any>null, <any>null, <any>null, <any>null, <any>null,
|
url, params, <any>null, <any>null, <any>null, <any>null, <any>null, <any>null, <any>null,
|
||||||
-1, null);
|
-1, null);
|
||||||
|
snapshot._routerState = new RouterStateSnapshot('', new TreeNode(snapshot, []));
|
||||||
|
return snapshot;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createSnapshotPairWithParent(
|
||||||
|
params: [Params, Params], parentParams: [Params, Params],
|
||||||
|
urls: [string, string]): [ActivatedRouteSnapshot, ActivatedRouteSnapshot] {
|
||||||
|
const snapshot1 = createSnapshot(params[0], []);
|
||||||
|
const snapshot2 = createSnapshot(params[1], []);
|
||||||
|
|
||||||
|
const snapshot1Parent = createSnapshot(parentParams[0], [new UrlSegment(urls[0], {})]);
|
||||||
|
const snapshot2Parent = createSnapshot(parentParams[1], [new UrlSegment(urls[1], {})]);
|
||||||
|
|
||||||
|
snapshot1._routerState =
|
||||||
|
new RouterStateSnapshot('', new TreeNode(snapshot1Parent, [new TreeNode(snapshot1, [])]));
|
||||||
|
snapshot2._routerState =
|
||||||
|
new RouterStateSnapshot('', new TreeNode(snapshot2Parent, [new TreeNode(snapshot2, [])]));
|
||||||
|
|
||||||
|
return [snapshot1, snapshot2];
|
||||||
}
|
}
|
||||||
|
|
||||||
it('should return false when params are different', () => {
|
it('should return false when params are different', () => {
|
||||||
|
@ -123,6 +142,27 @@ describe('RouterState & Snapshot', () => {
|
||||||
createSnapshot({a: 1}, [new UrlSegment('a', {})])))
|
createSnapshot({a: 1}, [new UrlSegment('a', {})])))
|
||||||
.toEqual(true);
|
.toEqual(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return false when upstream params are different', () => {
|
||||||
|
const [snapshot1, snapshot2] =
|
||||||
|
createSnapshotPairWithParent([{a: 1}, {a: 1}], [{b: 1}, {c: 1}], ['a', 'a']);
|
||||||
|
|
||||||
|
expect(equalParamsAndUrlSegments(snapshot1, snapshot2)).toEqual(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return false when upstream urls are different', () => {
|
||||||
|
const [snapshot1, snapshot2] =
|
||||||
|
createSnapshotPairWithParent([{a: 1}, {a: 1}], [{b: 1}, {b: 1}], ['a', 'b']);
|
||||||
|
|
||||||
|
expect(equalParamsAndUrlSegments(snapshot1, snapshot2)).toEqual(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return true when upstream urls and params are equal', () => {
|
||||||
|
const [snapshot1, snapshot2] =
|
||||||
|
createSnapshotPairWithParent([{a: 1}, {a: 1}], [{b: 1}, {b: 1}], ['a', 'a']);
|
||||||
|
|
||||||
|
expect(equalParamsAndUrlSegments(snapshot1, snapshot2)).toEqual(true);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('advanceActivatedRoute', () => {
|
describe('advanceActivatedRoute', () => {
|
||||||
|
@ -135,9 +175,12 @@ describe('RouterState & Snapshot', () => {
|
||||||
const queryParams = {};
|
const queryParams = {};
|
||||||
const fragment = '';
|
const fragment = '';
|
||||||
const data = {};
|
const data = {};
|
||||||
return new ActivatedRouteSnapshot(
|
const snapshot = new ActivatedRouteSnapshot(
|
||||||
url, params, queryParams, fragment, data, <any>null, <any>null, <any>null, <any>null, -1,
|
url, params, queryParams, fragment, data, <any>null, <any>null, <any>null, <any>null, -1,
|
||||||
null);
|
null);
|
||||||
|
const state = new RouterStateSnapshot('', new TreeNode(snapshot, []));
|
||||||
|
snapshot._routerState = state;
|
||||||
|
return snapshot;
|
||||||
}
|
}
|
||||||
|
|
||||||
it('should call change observers', () => {
|
it('should call change observers', () => {
|
||||||
|
|
Loading…
Reference in New Issue