@@ -10,8 +10,9 @@ import {EnvironmentInjector} from '@angular/core';
1010import { Observable , of } from 'rxjs' ;
1111import { map } from 'rxjs/operators' ;
1212
13- import { Route } from '../models' ;
13+ import { PartialMatchRouteSnapshot , Route } from '../models' ;
1414import { runCanMatchGuards } from '../operators/check_guards' ;
15+ import { ActivatedRouteSnapshot } from '../router_state' ;
1516import { defaultUrlMatcher , PRIMARY_OUTLET } from '../shared' ;
1617import { UrlSegment , UrlSegmentGroup , UrlSerializer } from '../url_tree' ;
1718
@@ -33,25 +34,49 @@ const noMatch: MatchResult = {
3334 positionalParamSegments : { } ,
3435} ;
3536
37+ export function createPreMatchRouteSnapshot (
38+ snapshot : ActivatedRouteSnapshot ,
39+ ) : PartialMatchRouteSnapshot {
40+ return {
41+ routeConfig : snapshot . routeConfig ,
42+ url : snapshot . url ,
43+ params : snapshot . params ,
44+ queryParams : snapshot . queryParams ,
45+ fragment : snapshot . fragment ,
46+ data : snapshot . data ,
47+ outlet : snapshot . outlet ,
48+ title : snapshot . title ,
49+ paramMap : snapshot . paramMap ,
50+ queryParamMap : snapshot . queryParamMap ,
51+ } ;
52+ }
53+
3654export function matchWithChecks (
3755 segmentGroup : UrlSegmentGroup ,
3856 route : Route ,
3957 segments : UrlSegment [ ] ,
4058 injector : EnvironmentInjector ,
4159 urlSerializer : UrlSerializer ,
60+ createSnapshot : ( result : MatchResult ) => ActivatedRouteSnapshot ,
4261 abortSignal : AbortSignal ,
4362) : Observable < MatchResult > {
4463 const result = match ( segmentGroup , route , segments ) ;
4564 if ( ! result . matched ) {
4665 return of ( result ) ;
4766 }
4867
68+ const currentSnapshot = createPreMatchRouteSnapshot ( createSnapshot ( result ) ) ;
4969 // Only create the Route's `EnvironmentInjector` if it matches the attempted
5070 // navigation
5171 injector = getOrCreateRouteInjectorIfNeeded ( route , injector ) ;
52- return runCanMatchGuards ( injector , route , segments , urlSerializer , abortSignal ) . pipe (
53- map ( ( v ) => ( v === true ? result : { ...noMatch } ) ) ,
54- ) ;
72+ return runCanMatchGuards (
73+ injector ,
74+ route ,
75+ segments ,
76+ urlSerializer ,
77+ currentSnapshot ,
78+ abortSignal ,
79+ ) . pipe ( map ( ( v ) => ( v === true ? result : { ...noMatch } ) ) ) ;
5580}
5681
5782export function match (
0 commit comments