docs(router): add api docs
This commit is contained in:
parent
0961bd1eff
commit
296a447e3c
@ -63,7 +63,7 @@ export function setupRouterInitializer(injector: Injector) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A list of {@link Provider}s. To use the router, you must add this to your application.
|
* An array of {@link Provider}s. To use the router, you must add this to your application.
|
||||||
*
|
*
|
||||||
* ### Example
|
* ### Example
|
||||||
*
|
*
|
||||||
@ -73,14 +73,14 @@ export function setupRouterInitializer(injector: Injector) {
|
|||||||
* // ...
|
* // ...
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* const router = [
|
* const config = [
|
||||||
* {path: '/home', component: Home}
|
* {path: 'home', component: Home}
|
||||||
* ];
|
* ];
|
||||||
*
|
*
|
||||||
* bootstrap(AppCmp, [provideRouter(router)]);
|
* bootstrap(AppCmp, [provideRouter(config)]);
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* @experimental
|
* @stable
|
||||||
*/
|
*/
|
||||||
export function provideRouter(_config: RouterConfig, _opts: ExtraOptions): any[] {
|
export function provideRouter(_config: RouterConfig, _opts: ExtraOptions): any[] {
|
||||||
return [
|
return [
|
||||||
|
@ -9,27 +9,247 @@
|
|||||||
import {Type} from '@angular/core';
|
import {Type} from '@angular/core';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @experimental
|
* `RouterConfig` is an array of route configurations. Each one has the following properties:
|
||||||
|
*
|
||||||
|
* - *`path`* is a string that uses the route matcher DSL.
|
||||||
|
* - `pathMatch` is a string that specifies the matching strategy.
|
||||||
|
* - `component` is a component type.
|
||||||
|
* - `redirectTo` is the url fragment which will replace the current matched segment.
|
||||||
|
* - `outlet` is the name of the outlet the component should be placed into.
|
||||||
|
* - `canActivate` is an array of DI tokens used to look up CanActivate handlers. See {@link
|
||||||
|
* CanActivate} for more info.
|
||||||
|
* - `canDeactivate` is an array of DI tokens used to look up CanDeactivate handlers. See {@link
|
||||||
|
* CanDeactivate} for more info.
|
||||||
|
* - `data` is additional data provided to the component via `ActivatedRoute`.
|
||||||
|
* - `resolve` is a map of DI tokens used to look up data resolvers. See {@link Resolve} for more
|
||||||
|
* info.
|
||||||
|
* - `children` is an array of child route definitions.
|
||||||
|
*
|
||||||
|
* ### Simple Configuration
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* [{
|
||||||
|
* path: 'team/:id',
|
||||||
|
* component: Team,
|
||||||
|
* children: [
|
||||||
|
* {
|
||||||
|
* path: 'user/:name',
|
||||||
|
* component: User
|
||||||
|
* }
|
||||||
|
* ]
|
||||||
|
* }]
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* When navigating to `/team/11/user/bob`, the router will create the team component with the user
|
||||||
|
* component in it.
|
||||||
|
*
|
||||||
|
* ### Multiple Outlets
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* [{
|
||||||
|
* path: 'team/:id',
|
||||||
|
* component: Team
|
||||||
|
* },
|
||||||
|
* {
|
||||||
|
* path: 'chat/:user',
|
||||||
|
* component: Chat
|
||||||
|
* outlet: aux
|
||||||
|
* }]
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* When navigating to `/team/11(aux:chat/jim)`, the router will create the team component next to
|
||||||
|
* the chat component. The chat component will be placed into the aux outlet.
|
||||||
|
*
|
||||||
|
* ### Wild Cards
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* [{
|
||||||
|
* path: '**',
|
||||||
|
* component: Sink
|
||||||
|
* }]
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Regardless of where you navigate to, the router will instantiate the sink component.
|
||||||
|
*
|
||||||
|
* ### Redirects
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* [{
|
||||||
|
* path: 'team/:id',
|
||||||
|
* component: Team,
|
||||||
|
* children: [
|
||||||
|
* {
|
||||||
|
* path: 'legacy/user/:name',
|
||||||
|
* redirectTo: 'user/:name'
|
||||||
|
* },
|
||||||
|
* {
|
||||||
|
* path: 'user/:name',
|
||||||
|
* component: User
|
||||||
|
* }
|
||||||
|
* ]
|
||||||
|
* }]
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* When navigating to '/team/11/legacy/user/jim', the router will change the url to
|
||||||
|
* '/team/11/user/jim', and then will instantiate the team component with the user component
|
||||||
|
* in it.
|
||||||
|
*
|
||||||
|
* If the `redirectTo` value starts with a '/', then it is a global redirect. E.g., if in the
|
||||||
|
* example above we change the `redirectTo` to `/user/:name`, the result url will be '/user/jim'.
|
||||||
|
*
|
||||||
|
* ### Empty Path
|
||||||
|
*
|
||||||
|
* Empty-path route configurations can be used to instantiate components that do not "consume"
|
||||||
|
* any url segments. Let's look at the following configuration:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* [{
|
||||||
|
* path: 'team/:id',
|
||||||
|
* component: Team,
|
||||||
|
* children: [
|
||||||
|
* {
|
||||||
|
* path: '',
|
||||||
|
* component: AllUsers
|
||||||
|
* },
|
||||||
|
* {
|
||||||
|
* path: 'user/:name',
|
||||||
|
* component: User
|
||||||
|
* }
|
||||||
|
* ]
|
||||||
|
* }]
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* When navigating to `/team/11`, the router will instantiate the AllUsers component.
|
||||||
|
*
|
||||||
|
* Empty-path routes can have children.
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* [{
|
||||||
|
* path: 'team/:id',
|
||||||
|
* component: Team,
|
||||||
|
* children: [
|
||||||
|
* {
|
||||||
|
* path: '',
|
||||||
|
* component: WrapperCmp,
|
||||||
|
* children: [
|
||||||
|
* {
|
||||||
|
* path: 'user/:name',
|
||||||
|
* component: User
|
||||||
|
* }
|
||||||
|
* ]
|
||||||
|
* }
|
||||||
|
* ]
|
||||||
|
* }]
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* When navigating to `/team/11/user/jim`, the router will instantiate the wrapper component with
|
||||||
|
* the user component in it.
|
||||||
|
*
|
||||||
|
* ### Matching Strategy
|
||||||
|
*
|
||||||
|
* By default the router will look at what is left in the url, and check if it starts with
|
||||||
|
* the specified path (e.g., `/team/11/user` starts with `team/:id`).
|
||||||
|
*
|
||||||
|
* We can change the matching strategy to make sure that the path covers the whole unconsumed url,
|
||||||
|
* which is akin to `unconsumedUrl === path` or `$` regular expressions.
|
||||||
|
*
|
||||||
|
* This is particularly important when redirecting empty-path routes.
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* [{
|
||||||
|
* path: '',
|
||||||
|
* pathMatch: 'prefix', //default
|
||||||
|
* redirectTo: 'main'
|
||||||
|
* },
|
||||||
|
* {
|
||||||
|
* path: 'main',
|
||||||
|
* component: Main
|
||||||
|
* }]
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Since an empty path is a prefix of any url, even when navigating to '/main', the router will
|
||||||
|
* still apply the redirect.
|
||||||
|
*
|
||||||
|
* If `pathMatch: full` is provided, the router will apply the redirect if and only if navigating to
|
||||||
|
* '/'.
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* [{
|
||||||
|
* path: '',
|
||||||
|
* pathMatch: 'full',
|
||||||
|
* redirectTo: 'main'
|
||||||
|
* },
|
||||||
|
* {
|
||||||
|
* path: 'main',
|
||||||
|
* component: Main
|
||||||
|
* }]
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* ### Componentless Routes
|
||||||
|
*
|
||||||
|
* It is useful at times to have the ability to share parameters between sibling components.
|
||||||
|
*
|
||||||
|
* Say we have two components--ChildCmp and AuxCmp--that we want to put next to each other and both
|
||||||
|
* of them require some id parameter.
|
||||||
|
*
|
||||||
|
* One way to do that would be to have a bogus parent component, so both the siblings can get the id
|
||||||
|
* parameter from it. This is not ideal. Instead, you can use a componentless route.
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* [{
|
||||||
|
* path: 'parent/:id',
|
||||||
|
* children: [
|
||||||
|
* { path: 'a', component: MainChild },
|
||||||
|
* { path: 'b', component: AuxChild, outlet: 'aux' }
|
||||||
|
* ]
|
||||||
|
* }]
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* So when navigating to `parent/10/(a//aux:b)`, the route will instantiate the main child and aux
|
||||||
|
* child components next to each other. In this example, the application component
|
||||||
|
* has to have the primary and aux outlets defined.
|
||||||
|
*
|
||||||
|
* The router will also merge the `params`, `data`, and `resolve` of the componentless parent into
|
||||||
|
* the `params`, `data`, and `resolve` of the children.
|
||||||
|
*
|
||||||
|
* This is especially useful when child components are defined as follows:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* [{
|
||||||
|
* path: 'parent/:id',
|
||||||
|
* children: [
|
||||||
|
* { path: '', component: MainChild },
|
||||||
|
* { path: '', component: AuxChild, outlet: 'aux' }
|
||||||
|
* ]
|
||||||
|
* }]
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* With this configuration in place, navigating to '/parent/10' will create the main child and aux
|
||||||
|
* components.
|
||||||
|
*
|
||||||
|
* @stable
|
||||||
*/
|
*/
|
||||||
export type RouterConfig = Route[];
|
export type RouterConfig = Route[];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @experimental
|
* See {@link RouterConfig} for more details.
|
||||||
|
* @stable
|
||||||
*/
|
*/
|
||||||
export type Data = {
|
export type Data = {
|
||||||
[name: string]: any
|
[name: string]: any
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @experimental
|
* See {@link RouterConfig} for more details.
|
||||||
|
* @stable
|
||||||
*/
|
*/
|
||||||
export type ResolveData = {
|
export type ResolveData = {
|
||||||
[name: string]: any
|
[name: string]: any
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @experimental
|
* See {@link RouterConfig} for more details.
|
||||||
|
* @stable
|
||||||
*/
|
*/
|
||||||
export interface Route {
|
export interface Route {
|
||||||
path?: string;
|
path?: string;
|
||||||
@ -40,13 +260,13 @@ export interface Route {
|
|||||||
terminal?: boolean;
|
terminal?: boolean;
|
||||||
pathMatch?: 'full'|'prefix';
|
pathMatch?: 'full'|'prefix';
|
||||||
component?: Type|string;
|
component?: Type|string;
|
||||||
|
redirectTo?: string;
|
||||||
outlet?: string;
|
outlet?: string;
|
||||||
canActivate?: any[];
|
canActivate?: any[];
|
||||||
canDeactivate?: any[];
|
canDeactivate?: any[];
|
||||||
redirectTo?: string;
|
|
||||||
children?: Route[];
|
|
||||||
data?: Data;
|
data?: Data;
|
||||||
resolve?: ResolveData;
|
resolve?: ResolveData;
|
||||||
|
children?: Route[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export function validateConfig(config: RouterConfig): void {
|
export function validateConfig(config: RouterConfig): void {
|
||||||
|
@ -13,32 +13,46 @@ import {Router} from '../router';
|
|||||||
import {ActivatedRoute} from '../router_state';
|
import {ActivatedRoute} from '../router_state';
|
||||||
import {UrlTree} from '../url_tree';
|
import {UrlTree} from '../url_tree';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The RouterLink directive lets you link to specific parts of your app.
|
* The RouterLink directive lets you link to specific parts of your app.
|
||||||
*
|
*
|
||||||
* Consider the following route configuration:
|
* Consider the following route configuration:
|
||||||
|
|
||||||
* ```
|
* ```
|
||||||
* [{ path: '/user', component: UserCmp }]
|
* [{ path: 'user/:name', component: UserCmp }]
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* When linking to this `User` route, you can write:
|
* When linking to this `User` route, you can write:
|
||||||
*
|
*
|
||||||
* ```
|
* ```
|
||||||
* <a [routerLink]="['/user']">link to user component</a>
|
* <a [routerLink]="/user/bob">link to user component</a>
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* RouterLink expects the value to be an array of path segments, followed by the params
|
* If you use dynamic values to generate the link, you can pass an array of path
|
||||||
* for that level of routing. For instance `['/team', {teamId: 1}, 'user', {userId: 2}]`
|
* segments, followed by the params for each segment.
|
||||||
* means that we want to generate a link to `/team;teamId=1/user;userId=2`.
|
|
||||||
*
|
*
|
||||||
* The first segment name can be prepended with `/`, `./`, or `../`.
|
* For instance `['/team', teamId, 'user', userName, {details: true}]`
|
||||||
* If the segment begins with `/`, the router will look up the route from the root of the app.
|
* means that we want to generate a link to `/team/11/user/bob;details=true`.
|
||||||
* If the segment begins with `./`, or doesn't begin with a slash, the router will
|
* Multiple static segments can be merged into one (e.g., `['/team/11/user', userName, {details:
|
||||||
* instead look in the current component's children for the route.
|
true}]`).
|
||||||
* And if the segment begins with `../`, the router will go up one level.
|
*
|
||||||
|
* The first segment name can be prepended with `/`, `./`, or `../`:
|
||||||
|
* * If the first segment begins with `/`, the router will look up the route from the root of the
|
||||||
|
app.
|
||||||
|
* * If the first segment begins with `./`, or doesn't begin with a slash, the router will
|
||||||
|
* instead look in the children of the current activated route.
|
||||||
|
* * And if the first segment begins with `../`, the router will go up one level.
|
||||||
|
*
|
||||||
|
* You can set query params and fragment as follows:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* <a [routerLink]="['/user/bob']" [queryParams]="{debug: true}" fragment="education">link to user
|
||||||
|
component</a>
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* RouterLink will use these to generate this link: `/user/bob#education?debug=true`.
|
||||||
|
*
|
||||||
|
* @stable
|
||||||
*/
|
*/
|
||||||
@Directive({selector: '[routerLink]'})
|
@Directive({selector: '[routerLink]'})
|
||||||
export class RouterLink implements OnChanges {
|
export class RouterLink implements OnChanges {
|
||||||
|
@ -14,17 +14,55 @@ import {containsTree} from '../url_tree';
|
|||||||
|
|
||||||
import {RouterLink} from './router_link';
|
import {RouterLink} from './router_link';
|
||||||
|
|
||||||
interface RouterLinkActiveOptions {
|
/**
|
||||||
exact: boolean;
|
* The RouterLinkActive directive lets you add a CSS class to an element when the link's route
|
||||||
}
|
* becomes active.
|
||||||
|
*
|
||||||
|
* Consider the following example:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* <a [routerLink]="/user/bob" routerLinkActive="active-link">Bob</a>
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* When the url is either '/user' or '/user/bob', the active-link class will
|
||||||
|
* be added to the `a` tag. If the url changes, the class will be removed.
|
||||||
|
*
|
||||||
|
* You can set more than one class, as follows:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* <a [routerLink]="/user/bob" routerLinkActive="class1 class2">Bob</a>
|
||||||
|
* <a [routerLink]="/user/bob" routerLinkActive="['class1', 'class2']">Bob</a>
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* You can configure RouterLinkActive by passing `exact: true`. This will add the classes
|
||||||
|
* only when the url matches the link exactly.
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* <a [routerLink]="/user/bob" routerLinkActive="active-link" [routerLinkActiveOptions]="{exact:
|
||||||
|
* true}">Bob</a>
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Finally, you can apply the RouterLinkActive directive to an ancestor of a RouterLink.
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* <div routerLinkActive="active-link" [routerLinkActiveOptions]="{exact: true}">
|
||||||
|
* <a [routerLink]="/user/jim">Jim</a>
|
||||||
|
* <a [routerLink]="/user/bob">Bob</a>
|
||||||
|
* </div>
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* This will set the active-link class on the div tag if the url is either '/user/jim' or
|
||||||
|
* '/user/bob'.
|
||||||
|
*
|
||||||
|
* @stable
|
||||||
|
*/
|
||||||
@Directive({selector: '[routerLinkActive]'})
|
@Directive({selector: '[routerLinkActive]'})
|
||||||
export class RouterLinkActive implements OnChanges, OnDestroy, AfterContentInit {
|
export class RouterLinkActive implements OnChanges, OnDestroy, AfterContentInit {
|
||||||
@ContentChildren(RouterLink) private links: QueryList<RouterLink>;
|
@ContentChildren(RouterLink) private links: QueryList<RouterLink>;
|
||||||
private classes: string[] = [];
|
private classes: string[] = [];
|
||||||
private subscription: Subscription;
|
private subscription: Subscription;
|
||||||
|
|
||||||
@Input() private routerLinkActiveOptions: RouterLinkActiveOptions = {exact: false};
|
@Input() private routerLinkActiveOptions: {exact: boolean} = {exact: false};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
|
@ -12,6 +12,19 @@ import {RouterOutletMap} from '../router_outlet_map';
|
|||||||
import {ActivatedRoute} from '../router_state';
|
import {ActivatedRoute} from '../router_state';
|
||||||
import {PRIMARY_OUTLET} from '../shared';
|
import {PRIMARY_OUTLET} from '../shared';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A router outlet is a placeholder that Angular dynamically fills based on the application's route.
|
||||||
|
*
|
||||||
|
* ## Use
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* <router-outlet></router-outlet>
|
||||||
|
* <router-outlet name="left"></router-outlet>
|
||||||
|
* <router-outlet name="right"></router-outlet>
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @stable
|
||||||
|
*/
|
||||||
@Directive({selector: 'router-outlet'})
|
@Directive({selector: 'router-outlet'})
|
||||||
export class RouterOutlet {
|
export class RouterOutlet {
|
||||||
private activated: ComponentRef<any>;
|
private activated: ComponentRef<any>;
|
||||||
@ -61,8 +74,10 @@ export class RouterOutlet {
|
|||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (!(e instanceof NoComponentFactoryError)) throw e;
|
if (!(e instanceof NoComponentFactoryError)) throw e;
|
||||||
const componentName = component ? component.name : null;
|
const componentName = component ? component.name : null;
|
||||||
|
|
||||||
console.warn(
|
console.warn(
|
||||||
`No component factory found for '${componentName}'. Add '${componentName}' to the 'precompile' list of your application component. This will be required in a future release of the router.`);
|
`'${componentName}' not found in precompile array. To ensure all components referred to by the RouterConfig are compiled, you must add '${componentName}' to the 'precompile' array of your application component. This will be required in a future release of the router.`);
|
||||||
|
|
||||||
factory = snapshot._resolvedComponentFactory;
|
factory = snapshot._resolvedComponentFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,43 @@ import {ActivatedRouteSnapshot, RouterStateSnapshot} from './router_state';
|
|||||||
/**
|
/**
|
||||||
* An interface a class can implement to be a guard deciding if a route can be activated.
|
* An interface a class can implement to be a guard deciding if a route can be activated.
|
||||||
*
|
*
|
||||||
* @experimental
|
* ### Example
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* class CanActivateTeam implements CanActivate {
|
||||||
|
* constructor(private permissions: Permissions, private currentUser: UserToken) {}
|
||||||
|
*
|
||||||
|
* canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean> {
|
||||||
|
* return this.permissions.canActivate(this.currentUser, this.route.params.id);
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* bootstrap(AppComponent, [
|
||||||
|
* CanActivateTeam,
|
||||||
|
*
|
||||||
|
* provideRouter([{
|
||||||
|
* path: 'team/:id',
|
||||||
|
* component: Team,
|
||||||
|
* canActivate: [CanActivateTeam]
|
||||||
|
* }])
|
||||||
|
* );
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* You can also provide a function with the same signature instead of the class:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* bootstrap(AppComponent, [
|
||||||
|
* {provide: 'canActivateTeam', useValue: (route: ActivatedRouteSnapshot, state:
|
||||||
|
* RouterStateSnapshot) => true},
|
||||||
|
* provideRouter([{
|
||||||
|
* path: 'team/:id',
|
||||||
|
* component: Team,
|
||||||
|
* canActivate: ['canActivateTeam']
|
||||||
|
* }])
|
||||||
|
* );
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @stable
|
||||||
*/
|
*/
|
||||||
export interface CanActivate {
|
export interface CanActivate {
|
||||||
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
|
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
|
||||||
@ -22,7 +58,43 @@ export interface CanActivate {
|
|||||||
/**
|
/**
|
||||||
* An interface a class can implement to be a guard deciding if a route can be deactivated.
|
* An interface a class can implement to be a guard deciding if a route can be deactivated.
|
||||||
*
|
*
|
||||||
* @experimental
|
* ### Example
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* class CanDeactivateTeam implements CanDeactivate {
|
||||||
|
* constructor(private permissions: Permissions, private currentUser: UserToken) {}
|
||||||
|
*
|
||||||
|
* canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean> {
|
||||||
|
* return this.permissions.canDeactivate(this.currentUser, this.route.params.id);
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* bootstrap(AppComponent, [
|
||||||
|
* CanDeactivateTeam,
|
||||||
|
*
|
||||||
|
* provideRouter([{
|
||||||
|
* path: 'team/:id',
|
||||||
|
* component: Team,
|
||||||
|
* canDeactivate: [CanDeactivateTeam]
|
||||||
|
* }])
|
||||||
|
* );
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* You can also provide a function with the same signature instead of the class:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* bootstrap(AppComponent, [
|
||||||
|
* {provide: 'canDeactivateTeam', useValue: (route: ActivatedRouteSnapshot, state:
|
||||||
|
* RouterStateSnapshot) => true},
|
||||||
|
* provideRouter([{
|
||||||
|
* path: 'team/:id',
|
||||||
|
* component: Team,
|
||||||
|
* canActivate: ['canDeactivateTeam']
|
||||||
|
* }])
|
||||||
|
* );
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @stable
|
||||||
*/
|
*/
|
||||||
export interface CanDeactivate<T> {
|
export interface CanDeactivate<T> {
|
||||||
canDeactivate(component: T, route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
|
canDeactivate(component: T, route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
|
||||||
@ -30,6 +102,34 @@ export interface CanDeactivate<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* An interface a class can implement to be a data provider.
|
||||||
|
*
|
||||||
|
* ### Example
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* class TeamResolver implements Resolve {
|
||||||
|
* constructor(private backend: Backend) {}
|
||||||
|
*
|
||||||
|
* resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<any> {
|
||||||
|
* return this.backend.fetchTeam(this.route.params.id);
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* bootstrap(AppComponent, [
|
||||||
|
* TeamResolver,
|
||||||
|
*
|
||||||
|
* provideRouter([{
|
||||||
|
* path: 'team/:id',
|
||||||
|
* component: TeamCmp,
|
||||||
|
* resolve: {
|
||||||
|
* team: TeamResolver
|
||||||
|
* }
|
||||||
|
* }])
|
||||||
|
* );
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* You can also provide a function with the same signature instead of the class.
|
||||||
|
*
|
||||||
* @experimental
|
* @experimental
|
||||||
*/
|
*/
|
||||||
export interface Resolve<T> {
|
export interface Resolve<T> {
|
||||||
|
@ -44,7 +44,7 @@ export interface NavigationExtras {
|
|||||||
/**
|
/**
|
||||||
* An event triggered when a navigation starts
|
* An event triggered when a navigation starts
|
||||||
*
|
*
|
||||||
* @experimental
|
* @stable
|
||||||
*/
|
*/
|
||||||
export class NavigationStart {
|
export class NavigationStart {
|
||||||
constructor(public id: number, public url: string) {}
|
constructor(public id: number, public url: string) {}
|
||||||
@ -55,7 +55,7 @@ export class NavigationStart {
|
|||||||
/**
|
/**
|
||||||
* An event triggered when a navigation ends successfully
|
* An event triggered when a navigation ends successfully
|
||||||
*
|
*
|
||||||
* @experimental
|
* @stable
|
||||||
*/
|
*/
|
||||||
export class NavigationEnd {
|
export class NavigationEnd {
|
||||||
constructor(public id: number, public url: string, public urlAfterRedirects: string) {}
|
constructor(public id: number, public url: string, public urlAfterRedirects: string) {}
|
||||||
@ -68,7 +68,7 @@ export class NavigationEnd {
|
|||||||
/**
|
/**
|
||||||
* An event triggered when a navigation is canceled
|
* An event triggered when a navigation is canceled
|
||||||
*
|
*
|
||||||
* @experimental
|
* @stable
|
||||||
*/
|
*/
|
||||||
export class NavigationCancel {
|
export class NavigationCancel {
|
||||||
constructor(public id: number, public url: string) {}
|
constructor(public id: number, public url: string) {}
|
||||||
@ -79,7 +79,7 @@ export class NavigationCancel {
|
|||||||
/**
|
/**
|
||||||
* An event triggered when a navigation fails due to unexpected error
|
* An event triggered when a navigation fails due to unexpected error
|
||||||
*
|
*
|
||||||
* @experimental
|
* @stable
|
||||||
*/
|
*/
|
||||||
export class NavigationError {
|
export class NavigationError {
|
||||||
constructor(public id: number, public url: string, public error: any) {}
|
constructor(public id: number, public url: string, public error: any) {}
|
||||||
@ -92,7 +92,7 @@ export class NavigationError {
|
|||||||
/**
|
/**
|
||||||
* An event triggered when routes are recognized
|
* An event triggered when routes are recognized
|
||||||
*
|
*
|
||||||
* @experimental
|
* @stable
|
||||||
*/
|
*/
|
||||||
export class RoutesRecognized {
|
export class RoutesRecognized {
|
||||||
constructor(
|
constructor(
|
||||||
@ -105,14 +105,16 @@ export class RoutesRecognized {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @experimental
|
* @stable
|
||||||
*/
|
*/
|
||||||
export type Event = NavigationStart | NavigationEnd | NavigationCancel | NavigationError;
|
export type Event = NavigationStart | NavigationEnd | NavigationCancel | NavigationError;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The `Router` is responsible for mapping URLs to components.
|
* The `Router` is responsible for mapping URLs to components.
|
||||||
*
|
*
|
||||||
* @experimental
|
* See {@link RouterConfig) for more details and examples.
|
||||||
|
*
|
||||||
|
* @stable
|
||||||
*/
|
*/
|
||||||
export class Router {
|
export class Router {
|
||||||
private currentUrlTree: UrlTree;
|
private currentUrlTree: UrlTree;
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
import {RouterOutlet} from './directives/router_outlet';
|
import {RouterOutlet} from './directives/router_outlet';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @experimental
|
* @stable
|
||||||
*/
|
*/
|
||||||
export class RouterOutletMap {
|
export class RouterOutletMap {
|
||||||
/** @internal */
|
/** @internal */
|
||||||
|
@ -25,10 +25,10 @@ import {RouterConfig} from './config';
|
|||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* const router = [
|
* const router = [
|
||||||
* {path: '/home', component: Home}
|
* {path: 'home', component: Home}
|
||||||
* ];
|
* ];
|
||||||
*
|
*
|
||||||
* bootstrap(AppCmp, [provideRouter(router)]);
|
* bootstrap(AppCmp, [provideRouter(router, {enableTracing: true})]);
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* @experimental
|
* @experimental
|
||||||
|
@ -32,7 +32,7 @@ import {Tree, TreeNode} from './utils/tree';
|
|||||||
* }
|
* }
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* @experimental
|
* @stable
|
||||||
*/
|
*/
|
||||||
export class RouterState extends Tree<ActivatedRoute> {
|
export class RouterState extends Tree<ActivatedRoute> {
|
||||||
/**
|
/**
|
||||||
@ -75,8 +75,7 @@ function createEmptyStateSnapshot(urlTree: UrlTree, rootComponent: Type): Router
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Contains the information about a component loaded in an outlet. The information is provided
|
* Contains the information about a component loaded in an outlet. The information is provided
|
||||||
* through
|
* through the params, urlSegments, and data observables.
|
||||||
* the params and urlSegments observables.
|
|
||||||
*
|
*
|
||||||
* ### Usage
|
* ### Usage
|
||||||
*
|
*
|
||||||
@ -84,11 +83,12 @@ function createEmptyStateSnapshot(urlTree: UrlTree, rootComponent: Type): Router
|
|||||||
* class MyComponent {
|
* class MyComponent {
|
||||||
* constructor(route: ActivatedRoute) {
|
* constructor(route: ActivatedRoute) {
|
||||||
* const id: Observable<string> = route.params.map(p => p.id);
|
* const id: Observable<string> = route.params.map(p => p.id);
|
||||||
|
* const data = route.data.map(d => d.user); //includes `data` and `resolve`
|
||||||
* }
|
* }
|
||||||
* }
|
* }
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* @experimental
|
* @stable
|
||||||
*/
|
*/
|
||||||
export class ActivatedRoute {
|
export class ActivatedRoute {
|
||||||
/** @internal */
|
/** @internal */
|
||||||
@ -110,6 +110,9 @@ export class ActivatedRoute {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
export class InheritedResolve {
|
export class InheritedResolve {
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
@ -138,11 +141,12 @@ export class InheritedResolve {
|
|||||||
* class MyComponent {
|
* class MyComponent {
|
||||||
* constructor(route: ActivatedRoute) {
|
* constructor(route: ActivatedRoute) {
|
||||||
* const id: string = route.snapshot.params.id;
|
* const id: string = route.snapshot.params.id;
|
||||||
|
* const data = route.snapshot.data;
|
||||||
* }
|
* }
|
||||||
* }
|
* }
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* @experimental
|
* @stable
|
||||||
*/
|
*/
|
||||||
export class ActivatedRouteSnapshot {
|
export class ActivatedRouteSnapshot {
|
||||||
/**
|
/**
|
||||||
@ -195,7 +199,7 @@ export class ActivatedRouteSnapshot {
|
|||||||
* }
|
* }
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* @experimental
|
* @stable
|
||||||
*/
|
*/
|
||||||
export class RouterStateSnapshot extends Tree<ActivatedRouteSnapshot> {
|
export class RouterStateSnapshot extends Tree<ActivatedRouteSnapshot> {
|
||||||
/**
|
/**
|
||||||
|
@ -63,7 +63,7 @@ function containsSegmentHelper(
|
|||||||
/**
|
/**
|
||||||
* A URL in the tree form.
|
* A URL in the tree form.
|
||||||
*
|
*
|
||||||
* @experimental
|
* @stable
|
||||||
*/
|
*/
|
||||||
export class UrlTree {
|
export class UrlTree {
|
||||||
/**
|
/**
|
||||||
@ -76,6 +76,9 @@ export class UrlTree {
|
|||||||
toString(): string { return new DefaultUrlSerializer().serialize(this); }
|
toString(): string { return new DefaultUrlSerializer().serialize(this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @stable
|
||||||
|
*/
|
||||||
export class UrlSegment {
|
export class UrlSegment {
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
@ -100,7 +103,7 @@ export class UrlSegment {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @experimental
|
* @stable
|
||||||
*/
|
*/
|
||||||
export class UrlPathWithParams {
|
export class UrlPathWithParams {
|
||||||
constructor(public path: string, public parameters: {[key: string]: string}) {}
|
constructor(public path: string, public parameters: {[key: string]: string}) {}
|
||||||
|
40
tools/public_api_guard/router/index.d.ts
vendored
40
tools/public_api_guard/router/index.d.ts
vendored
@ -1,4 +1,4 @@
|
|||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare class ActivatedRoute {
|
export declare class ActivatedRoute {
|
||||||
component: Type | string;
|
component: Type | string;
|
||||||
data: Observable<Data>;
|
data: Observable<Data>;
|
||||||
@ -9,7 +9,7 @@ export declare class ActivatedRoute {
|
|||||||
toString(): string;
|
toString(): string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare class ActivatedRouteSnapshot {
|
export declare class ActivatedRouteSnapshot {
|
||||||
component: Type | string;
|
component: Type | string;
|
||||||
data: Data;
|
data: Data;
|
||||||
@ -19,17 +19,17 @@ export declare class ActivatedRouteSnapshot {
|
|||||||
toString(): string;
|
toString(): string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export interface CanActivate {
|
export interface CanActivate {
|
||||||
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean;
|
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export interface CanDeactivate<T> {
|
export interface CanDeactivate<T> {
|
||||||
canDeactivate(component: T, route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean;
|
canDeactivate(component: T, route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare type Data = {
|
export declare type Data = {
|
||||||
[name: string]: any;
|
[name: string]: any;
|
||||||
};
|
};
|
||||||
@ -40,7 +40,7 @@ export declare class DefaultUrlSerializer implements UrlSerializer {
|
|||||||
serialize(tree: UrlTree): string;
|
serialize(tree: UrlTree): string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare type Event = NavigationStart | NavigationEnd | NavigationCancel | NavigationError;
|
export declare type Event = NavigationStart | NavigationEnd | NavigationCancel | NavigationError;
|
||||||
|
|
||||||
/** @experimental */
|
/** @experimental */
|
||||||
@ -48,7 +48,7 @@ export interface ExtraOptions {
|
|||||||
enableTracing?: boolean;
|
enableTracing?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare class NavigationCancel {
|
export declare class NavigationCancel {
|
||||||
id: number;
|
id: number;
|
||||||
url: string;
|
url: string;
|
||||||
@ -56,7 +56,7 @@ export declare class NavigationCancel {
|
|||||||
toString(): string;
|
toString(): string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare class NavigationEnd {
|
export declare class NavigationEnd {
|
||||||
id: number;
|
id: number;
|
||||||
url: string;
|
url: string;
|
||||||
@ -65,7 +65,7 @@ export declare class NavigationEnd {
|
|||||||
toString(): string;
|
toString(): string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare class NavigationError {
|
export declare class NavigationError {
|
||||||
error: any;
|
error: any;
|
||||||
id: number;
|
id: number;
|
||||||
@ -74,7 +74,7 @@ export declare class NavigationError {
|
|||||||
toString(): string;
|
toString(): string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare class NavigationStart {
|
export declare class NavigationStart {
|
||||||
id: number;
|
id: number;
|
||||||
url: string;
|
url: string;
|
||||||
@ -98,18 +98,18 @@ export interface Resolve<T> {
|
|||||||
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> | any;
|
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> | any;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare type ResolveData = {
|
export declare type ResolveData = {
|
||||||
[name: string]: any;
|
[name: string]: any;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export interface Route {
|
export interface Route {
|
||||||
path?: string;
|
path?: string;
|
||||||
pathMatch?:
|
pathMatch?:
|
||||||
/** @deprecated */ terminal?: boolean;
|
/** @deprecated */ terminal?: boolean;
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare class Router {
|
export declare class Router {
|
||||||
events: Observable<Event>;
|
events: Observable<Event>;
|
||||||
routerState: RouterState;
|
routerState: RouterState;
|
||||||
@ -125,15 +125,15 @@ export declare class Router {
|
|||||||
/** @experimental */
|
/** @experimental */
|
||||||
export declare const ROUTER_DIRECTIVES: (typeof RouterOutlet | typeof RouterLink | typeof RouterLinkActive)[];
|
export declare const ROUTER_DIRECTIVES: (typeof RouterOutlet | typeof RouterLink | typeof RouterLinkActive)[];
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare type RouterConfig = Route[];
|
export declare type RouterConfig = Route[];
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare class RouterOutletMap {
|
export declare class RouterOutletMap {
|
||||||
registerOutlet(name: string, outlet: RouterOutlet): void;
|
registerOutlet(name: string, outlet: RouterOutlet): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare class RouterState extends Tree<ActivatedRoute> {
|
export declare class RouterState extends Tree<ActivatedRoute> {
|
||||||
fragment: Observable<string>;
|
fragment: Observable<string>;
|
||||||
queryParams: Observable<Params>;
|
queryParams: Observable<Params>;
|
||||||
@ -141,7 +141,7 @@ export declare class RouterState extends Tree<ActivatedRoute> {
|
|||||||
toString(): string;
|
toString(): string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare class RouterStateSnapshot extends Tree<ActivatedRouteSnapshot> {
|
export declare class RouterStateSnapshot extends Tree<ActivatedRouteSnapshot> {
|
||||||
fragment: string;
|
fragment: string;
|
||||||
queryParams: Params;
|
queryParams: Params;
|
||||||
@ -149,7 +149,7 @@ export declare class RouterStateSnapshot extends Tree<ActivatedRouteSnapshot> {
|
|||||||
toString(): string;
|
toString(): string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare class RoutesRecognized {
|
export declare class RoutesRecognized {
|
||||||
id: number;
|
id: number;
|
||||||
state: RouterStateSnapshot;
|
state: RouterStateSnapshot;
|
||||||
@ -159,7 +159,7 @@ export declare class RoutesRecognized {
|
|||||||
toString(): string;
|
toString(): string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare class UrlPathWithParams {
|
export declare class UrlPathWithParams {
|
||||||
parameters: {
|
parameters: {
|
||||||
[key: string]: string;
|
[key: string]: string;
|
||||||
@ -177,7 +177,7 @@ export declare abstract class UrlSerializer {
|
|||||||
abstract serialize(tree: UrlTree): string;
|
abstract serialize(tree: UrlTree): string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @stable */
|
||||||
export declare class UrlTree {
|
export declare class UrlTree {
|
||||||
fragment: string;
|
fragment: string;
|
||||||
queryParams: {
|
queryParams: {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user