refactor(core): remove getters for packages/animations, language-service, platform-browser, router (#19151)
PR Close #19151
This commit is contained in:
@ -86,7 +86,7 @@ export class RouterLinkActive implements OnChanges,
|
||||
|
||||
private classes: string[] = [];
|
||||
private subscription: Subscription;
|
||||
private active: boolean = false;
|
||||
public readonly isActive: boolean = false;
|
||||
|
||||
@Input() routerLinkActiveOptions: {exact: boolean} = {exact: false};
|
||||
|
||||
@ -100,7 +100,6 @@ export class RouterLinkActive implements OnChanges,
|
||||
});
|
||||
}
|
||||
|
||||
get isActive(): boolean { return this.active; }
|
||||
|
||||
ngAfterContentInit(): void {
|
||||
this.links.changes.subscribe(_ => this.update());
|
||||
@ -122,7 +121,7 @@ export class RouterLinkActive implements OnChanges,
|
||||
const hasActiveLinks = this.hasActiveLinks();
|
||||
|
||||
// react only when status has changed to prevent unnecessary dom updates
|
||||
if (this.active !== hasActiveLinks) {
|
||||
if (this.isActive !== hasActiveLinks) {
|
||||
this.classes.forEach((c) => {
|
||||
if (hasActiveLinks) {
|
||||
this.renderer.addClass(this.element.nativeElement, c);
|
||||
@ -130,7 +129,9 @@ export class RouterLinkActive implements OnChanges,
|
||||
this.renderer.removeClass(this.element.nativeElement, c);
|
||||
}
|
||||
});
|
||||
Promise.resolve(hasActiveLinks).then(active => this.active = active);
|
||||
Promise.resolve(hasActiveLinks).then(active => (this as{
|
||||
isActive: boolean
|
||||
}).isActive = active);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -128,7 +128,7 @@ export class RouterOutlet implements OnDestroy, OnInit {
|
||||
}
|
||||
this._activatedRoute = activatedRoute;
|
||||
const snapshot = activatedRoute._futureSnapshot;
|
||||
const component = <any>snapshot._routeConfig !.component;
|
||||
const component = <any>snapshot.routeConfig !.component;
|
||||
resolver = resolver || this.resolver;
|
||||
const factory = resolver.resolveComponentFactory(component);
|
||||
const childContexts = this.parentContexts.getOrCreateContext(this.name).children;
|
||||
|
@ -108,9 +108,9 @@ export class PreActivation {
|
||||
const context = parentContexts ? parentContexts.getContext(futureNode.value.outlet) : null;
|
||||
|
||||
// reusing the node
|
||||
if (curr && future._routeConfig === curr._routeConfig) {
|
||||
if (curr && future.routeConfig === curr.routeConfig) {
|
||||
const shouldRunGuardsAndResolvers = this.shouldRunGuardsAndResolvers(
|
||||
curr, future, future._routeConfig !.runGuardsAndResolvers);
|
||||
curr, future, future.routeConfig !.runGuardsAndResolvers);
|
||||
if (shouldRunGuardsAndResolvers) {
|
||||
this.canActivateChecks.push(new CanActivate(futurePath));
|
||||
} else {
|
||||
@ -241,7 +241,7 @@ export class PreActivation {
|
||||
}
|
||||
|
||||
private runCanActivate(future: ActivatedRouteSnapshot): Observable<boolean> {
|
||||
const canActivate = future._routeConfig ? future._routeConfig.canActivate : null;
|
||||
const canActivate = future.routeConfig ? future.routeConfig.canActivate : null;
|
||||
if (!canActivate || canActivate.length === 0) return of (true);
|
||||
const obs = map.call(from(canActivate), (c: any) => {
|
||||
const guard = this.getToken(c, future);
|
||||
@ -281,14 +281,14 @@ export class PreActivation {
|
||||
|
||||
private extractCanActivateChild(p: ActivatedRouteSnapshot):
|
||||
{node: ActivatedRouteSnapshot, guards: any[]}|null {
|
||||
const canActivateChild = p._routeConfig ? p._routeConfig.canActivateChild : null;
|
||||
const canActivateChild = p.routeConfig ? p.routeConfig.canActivateChild : null;
|
||||
if (!canActivateChild || canActivateChild.length === 0) return null;
|
||||
return {node: p, guards: canActivateChild};
|
||||
}
|
||||
|
||||
private runCanDeactivate(component: Object|null, curr: ActivatedRouteSnapshot):
|
||||
Observable<boolean> {
|
||||
const canDeactivate = curr && curr._routeConfig ? curr._routeConfig.canDeactivate : null;
|
||||
const canDeactivate = curr && curr.routeConfig ? curr.routeConfig.canDeactivate : null;
|
||||
if (!canDeactivate || canDeactivate.length === 0) return of (true);
|
||||
const canDeactivate$ = mergeMap.call(from(canDeactivate), (c: any) => {
|
||||
const guard = this.getToken(c, curr);
|
||||
@ -351,7 +351,7 @@ function closestLoadedConfig(snapshot: ActivatedRouteSnapshot): LoadedRouterConf
|
||||
if (!snapshot) return null;
|
||||
|
||||
for (let s = snapshot.parent; s; s = s.parent) {
|
||||
const route = s._routeConfig;
|
||||
const route = s.routeConfig;
|
||||
if (route && route._loadedConfig) return route._loadedConfig;
|
||||
}
|
||||
|
||||
|
@ -200,16 +200,16 @@ function defaultRouterHook(snapshot: RouterStateSnapshot): Observable<void> {
|
||||
export class Router {
|
||||
private currentUrlTree: UrlTree;
|
||||
private rawUrlTree: UrlTree;
|
||||
|
||||
private navigations = new BehaviorSubject<NavigationParams>(null !);
|
||||
private routerEvents = new Subject<Event>();
|
||||
|
||||
private currentRouterState: RouterState;
|
||||
private locationSubscription: Subscription;
|
||||
private navigationId: number = 0;
|
||||
private configLoader: RouterConfigLoader;
|
||||
private ngModule: NgModuleRef<any>;
|
||||
|
||||
public readonly events: Observable<Event> = new Subject<Event>();
|
||||
public readonly routerState: RouterState;
|
||||
|
||||
/**
|
||||
* Error handler that is invoked when a navigation errors.
|
||||
*
|
||||
@ -259,7 +259,7 @@ export class Router {
|
||||
this.rawUrlTree = this.currentUrlTree;
|
||||
|
||||
this.configLoader = new RouterConfigLoader(loader, compiler, onLoadStart, onLoadEnd);
|
||||
this.currentRouterState = createEmptyState(this.currentUrlTree, this.rootComponentType);
|
||||
this.routerState = createEmptyState(this.currentUrlTree, this.rootComponentType);
|
||||
this.processNavigations();
|
||||
}
|
||||
|
||||
@ -271,7 +271,7 @@ export class Router {
|
||||
this.rootComponentType = rootComponentType;
|
||||
// TODO: vsavkin router 4.0 should make the root component set to null
|
||||
// this will simplify the lifecycle of the router.
|
||||
this.currentRouterState.root.component = this.rootComponentType;
|
||||
this.routerState.root.component = this.rootComponentType;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -299,17 +299,11 @@ export class Router {
|
||||
}
|
||||
}
|
||||
|
||||
/** The current route state */
|
||||
get routerState(): RouterState { return this.currentRouterState; }
|
||||
|
||||
/** The current url */
|
||||
get url(): string { return this.serializeUrl(this.currentUrlTree); }
|
||||
|
||||
/** An observable of router events */
|
||||
get events(): Observable<Event> { return this.routerEvents; }
|
||||
|
||||
/** @internal */
|
||||
triggerEvent(e: Event): void { this.routerEvents.next(e); }
|
||||
triggerEvent(e: Event): void { (this.events as Subject<Event>).next(e); }
|
||||
|
||||
/**
|
||||
* Resets the configuration used for navigation and generating links.
|
||||
@ -552,7 +546,7 @@ export class Router {
|
||||
const urlTransition = !this.navigated || url.toString() !== this.currentUrlTree.toString();
|
||||
|
||||
if (urlTransition && this.urlHandlingStrategy.shouldProcessUrl(rawUrl)) {
|
||||
this.routerEvents.next(new NavigationStart(id, this.serializeUrl(url)));
|
||||
(this.events as Subject<Event>).next(new NavigationStart(id, this.serializeUrl(url)));
|
||||
Promise.resolve()
|
||||
.then(
|
||||
(_) => this.runNavigate(
|
||||
@ -564,7 +558,7 @@ export class Router {
|
||||
} else if (
|
||||
urlTransition && this.rawUrlTree &&
|
||||
this.urlHandlingStrategy.shouldProcessUrl(this.rawUrlTree)) {
|
||||
this.routerEvents.next(new NavigationStart(id, this.serializeUrl(url)));
|
||||
(this.events as Subject<Event>).next(new NavigationStart(id, this.serializeUrl(url)));
|
||||
Promise.resolve()
|
||||
.then(
|
||||
(_) => this.runNavigate(
|
||||
@ -583,9 +577,10 @@ export class Router {
|
||||
id: number, precreatedState: RouterStateSnapshot|null): Promise<boolean> {
|
||||
if (id !== this.navigationId) {
|
||||
this.location.go(this.urlSerializer.serialize(this.currentUrlTree));
|
||||
this.routerEvents.next(new NavigationCancel(
|
||||
id, this.serializeUrl(url),
|
||||
`Navigation ID ${id} is not equal to the current navigation id ${this.navigationId}`));
|
||||
(this.events as Subject<Event>)
|
||||
.next(new NavigationCancel(
|
||||
id, this.serializeUrl(url),
|
||||
`Navigation ID ${id} is not equal to the current navigation id ${this.navigationId}`));
|
||||
return Promise.resolve(false);
|
||||
}
|
||||
|
||||
@ -604,8 +599,9 @@ export class Router {
|
||||
this.rootComponentType, this.config, appliedUrl, this.serializeUrl(appliedUrl)),
|
||||
(snapshot: any) => {
|
||||
|
||||
this.routerEvents.next(new RoutesRecognized(
|
||||
id, this.serializeUrl(url), this.serializeUrl(appliedUrl), snapshot));
|
||||
(this.events as Subject<Event>)
|
||||
.next(new RoutesRecognized(
|
||||
id, this.serializeUrl(url), this.serializeUrl(appliedUrl), snapshot));
|
||||
|
||||
return {appliedUrl, snapshot};
|
||||
});
|
||||
@ -627,7 +623,7 @@ export class Router {
|
||||
({appliedUrl, snapshot}: {appliedUrl: string, snapshot: RouterStateSnapshot}) => {
|
||||
const moduleInjector = this.ngModule.injector;
|
||||
preActivation = new PreActivation(
|
||||
snapshot, this.currentRouterState.snapshot, moduleInjector,
|
||||
snapshot, this.routerState.snapshot, moduleInjector,
|
||||
(evt: Event) => this.triggerEvent(evt));
|
||||
preActivation.initalize(this.rootContexts);
|
||||
return {appliedUrl, snapshot};
|
||||
@ -676,8 +672,7 @@ export class Router {
|
||||
const routerState$ =
|
||||
map.call(preactivationDone$, ({appliedUrl, snapshot, shouldActivate}: any) => {
|
||||
if (shouldActivate) {
|
||||
const state =
|
||||
createRouterState(this.routeReuseStrategy, snapshot, this.currentRouterState);
|
||||
const state = createRouterState(this.routeReuseStrategy, snapshot, this.routerState);
|
||||
return {appliedUrl, state, shouldActivate};
|
||||
} else {
|
||||
return {appliedUrl, state: null, shouldActivate};
|
||||
@ -688,7 +683,7 @@ export class Router {
|
||||
// applied the new router state
|
||||
// this operation has side effects
|
||||
let navigationIsSuccessful: boolean;
|
||||
const storedState = this.currentRouterState;
|
||||
const storedState = this.routerState;
|
||||
const storedUrl = this.currentUrlTree;
|
||||
|
||||
routerState$
|
||||
@ -701,7 +696,7 @@ export class Router {
|
||||
this.currentUrlTree = appliedUrl;
|
||||
this.rawUrlTree = this.urlHandlingStrategy.merge(this.currentUrlTree, rawUrl);
|
||||
|
||||
this.currentRouterState = state;
|
||||
(this as{routerState: RouterState}).routerState = state;
|
||||
|
||||
if (!shouldPreventPushState) {
|
||||
const path = this.urlSerializer.serialize(this.rawUrlTree);
|
||||
@ -722,12 +717,14 @@ export class Router {
|
||||
() => {
|
||||
if (navigationIsSuccessful) {
|
||||
this.navigated = true;
|
||||
this.routerEvents.next(new NavigationEnd(
|
||||
id, this.serializeUrl(url), this.serializeUrl(this.currentUrlTree)));
|
||||
(this.events as Subject<Event>)
|
||||
.next(new NavigationEnd(
|
||||
id, this.serializeUrl(url), this.serializeUrl(this.currentUrlTree)));
|
||||
resolvePromise(true);
|
||||
} else {
|
||||
this.resetUrlToCurrentUrlTree();
|
||||
this.routerEvents.next(new NavigationCancel(id, this.serializeUrl(url), ''));
|
||||
(this.events as Subject<Event>)
|
||||
.next(new NavigationCancel(id, this.serializeUrl(url), ''));
|
||||
resolvePromise(false);
|
||||
}
|
||||
},
|
||||
@ -735,11 +732,12 @@ export class Router {
|
||||
if (isNavigationCancelingError(e)) {
|
||||
this.resetUrlToCurrentUrlTree();
|
||||
this.navigated = true;
|
||||
this.routerEvents.next(
|
||||
new NavigationCancel(id, this.serializeUrl(url), e.message));
|
||||
(this.events as Subject<Event>)
|
||||
.next(new NavigationCancel(id, this.serializeUrl(url), e.message));
|
||||
resolvePromise(false);
|
||||
} else {
|
||||
this.routerEvents.next(new NavigationError(id, this.serializeUrl(url), e));
|
||||
(this.events as Subject<Event>)
|
||||
.next(new NavigationError(id, this.serializeUrl(url), e));
|
||||
try {
|
||||
resolvePromise(this.errorHandler(e));
|
||||
} catch (ee) {
|
||||
@ -747,7 +745,7 @@ export class Router {
|
||||
}
|
||||
}
|
||||
|
||||
this.currentRouterState = storedState;
|
||||
(this as{routerState: RouterState}).routerState = storedState;
|
||||
this.currentUrlTree = storedUrl;
|
||||
this.rawUrlTree = this.urlHandlingStrategy.merge(this.currentUrlTree, rawUrl);
|
||||
this.location.replaceState(this.serializeUrl(this.rawUrlTree));
|
||||
@ -936,7 +934,7 @@ function advanceActivatedRouteNodeAndItsChildren(node: TreeNode<ActivatedRoute>)
|
||||
|
||||
function parentLoadedConfig(snapshot: ActivatedRouteSnapshot): LoadedRouterConfig|null {
|
||||
for (let s = snapshot.parent; s; s = s.parent) {
|
||||
const route = s._routeConfig;
|
||||
const route = s.routeConfig;
|
||||
if (route && route._loadedConfig) return route._loadedConfig;
|
||||
if (route && route.component) return null;
|
||||
}
|
||||
|
@ -233,8 +233,8 @@ export function inheritedParamsDataResolve(route: ActivatedRouteSnapshot): Inher
|
||||
* @stable
|
||||
*/
|
||||
export class ActivatedRouteSnapshot {
|
||||
/** @internal **/
|
||||
_routeConfig: Route|null;
|
||||
/** The configuration used to match this route **/
|
||||
public readonly routeConfig: Route|null;
|
||||
/** @internal **/
|
||||
_urlSegment: UrlSegmentGroup;
|
||||
/** @internal */
|
||||
@ -267,15 +267,12 @@ export class ActivatedRouteSnapshot {
|
||||
/** The component of the route */
|
||||
public component: Type<any>|string|null, routeConfig: Route|null, urlSegment: UrlSegmentGroup,
|
||||
lastPathIndex: number, resolve: ResolveData) {
|
||||
this._routeConfig = routeConfig;
|
||||
this.routeConfig = routeConfig;
|
||||
this._urlSegment = urlSegment;
|
||||
this._lastPathIndex = lastPathIndex;
|
||||
this._resolve = resolve;
|
||||
}
|
||||
|
||||
/** The configuration used to match this route */
|
||||
get routeConfig(): Route|null { return this._routeConfig; }
|
||||
|
||||
/** The root of the router state */
|
||||
get root(): ActivatedRouteSnapshot { return this._routerState.root; }
|
||||
|
||||
@ -307,7 +304,7 @@ export class ActivatedRouteSnapshot {
|
||||
|
||||
toString(): string {
|
||||
const url = this.url.map(segment => segment.toString()).join('/');
|
||||
const matched = this._routeConfig ? this._routeConfig.path : '';
|
||||
const matched = this.routeConfig ? this.routeConfig.path : '';
|
||||
return `Route(url:'${url}', path:'${matched}')`;
|
||||
}
|
||||
}
|
||||
@ -400,4 +397,4 @@ export function equalParamsAndUrlSegments(
|
||||
|
||||
return equalUrlParams && !parentsMismatch &&
|
||||
(!a.parent || equalParamsAndUrlSegments(a.parent, b.parent !));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user