angular-cn/modules/@angular/router/src/interfaces.ts

380 lines
8.5 KiB
TypeScript
Raw Normal View History

/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import {Observable} from 'rxjs/Observable';
2016-07-26 17:39:02 -04:00
import {Route} from './config';
import {ActivatedRouteSnapshot, RouterStateSnapshot} from './router_state';
2016-07-26 17:39:02 -04:00
/**
* @whatItDoes Indicates that a class can implement to be a guard deciding if a route can be
* activated.
*
* @howToUse
2016-06-28 17:49:29 -04:00
*
* ```
2016-08-30 18:57:24 -04:00
* class UserToken {}
* class Permissions {
* canActivate(user: UserToken, id: string): boolean {
* return true;
* }
* }
*
* @Injectable()
2016-06-28 17:49:29 -04:00
* class CanActivateTeam implements CanActivate {
* constructor(private permissions: Permissions, private currentUser: UserToken) {}
*
* canActivate(
* route: ActivatedRouteSnapshot,
* state: RouterStateSnapshot
* ): Observable<boolean>|Promise<boolean>|boolean {
* return this.permissions.canActivate(this.currentUser, route.params.id);
2016-06-28 17:49:29 -04:00
* }
* }
*
* @NgModule({
* imports: [
* RouterModule.forRoot([
* {
* path: 'team/:id',
* component: TeamCmp,
* canActivate: [CanActivateTeam]
* }
* ])
* ],
2016-08-30 18:57:24 -04:00
* providers: [CanActivateTeam, UserToken, Permissions]
* })
2016-08-30 18:57:24 -04:00
* class AppModule {}
2016-06-28 17:49:29 -04:00
* ```
*
* You can also provide a function with the same signature instead of the class:
*
* ```
* @NgModule({
* imports: [
* RouterModule.forRoot([
* {
* path: 'team/:id',
* component: TeamCmp,
* canActivate: ['canActivateTeam']
* }
* ])
* ],
* providers: [
* {
* provide: 'canActivateTeam',
* useValue: (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => true
* }
* ]
* })
2016-08-30 18:57:24 -04:00
* class AppModule {}
2016-06-28 17:49:29 -04:00
* ```
*
* @stable
*/
export interface CanActivate {
2016-06-08 14:13:41 -04:00
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
Observable<boolean>|Promise<boolean>|boolean;
}
/**
* @whatItDoes Indicates that a class can implement to be a guard deciding if a child route can be
* activated.
*
* @howToUse
*
* ```
2016-08-30 18:57:24 -04:00
* class UserToken {}
* class Permissions {
* canActivate(user: UserToken, id: string): boolean {
* return true;
* }
* }
*
* @Injectable()
* class CanActivateTeam implements CanActivateChild {
* constructor(private permissions: Permissions, private currentUser: UserToken) {}
*
* canActivateChild(
* route: ActivatedRouteSnapshot,
* state: RouterStateSnapshot
* ): Observable<boolean>|Promise<boolean>|boolean {
2016-07-26 17:39:02 -04:00
* return this.permissions.canActivate(this.currentUser, route.params.id);
* }
* }
*
* @NgModule({
* imports: [
* RouterModule.forRoot([
* {
* path: 'root',
* canActivateChild: [CanActivateTeam],
* children: [
* {
* path: 'team/:id',
* component: Team
* }
* ]
* }
* ])
* ],
2016-08-30 18:57:24 -04:00
* providers: [CanActivateTeam, UserToken, Permissions]
* })
2016-08-30 18:57:24 -04:00
* class AppModule {}
* ```
*
* You can also provide a function with the same signature instead of the class:
*
* ```
* @NgModule({
* imports: [
* RouterModule.forRoot([
* {
* path: 'root',
* canActivateChild: ['canActivateTeam'],
* children: [
* {
* path: 'team/:id',
* component: Team
* }
* ]
* }
* ])
* ],
* providers: [
* {
* provide: 'canActivateTeam',
* useValue: (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => true
* }
* ]
* })
2016-08-30 18:57:24 -04:00
* class AppModule {}
* ```
*
* @stable
*/
export interface CanActivateChild {
canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot):
Observable<boolean>|Promise<boolean>|boolean;
}
/**
* @whatItDoes Indicates that a class can implement to be a guard deciding if a route can be
* deactivated.
*
* @howToUse
2016-06-28 17:49:29 -04:00
*
* ```
2016-08-30 18:57:24 -04:00
* class UserToken {}
* class Permissions {
* canDeactivate(user: UserToken, id: string): boolean {
* return true;
* }
* }
*
* @Injectable()
* class CanDeactivateTeam implements CanDeactivate<TeamComponent> {
2016-06-28 17:49:29 -04:00
* constructor(private permissions: Permissions, private currentUser: UserToken) {}
*
* canDeactivate(
* component: TeamComponent,
* route: ActivatedRouteSnapshot,
* state: RouterStateSnapshot
* ): Observable<boolean>|Promise<boolean>|boolean {
2016-07-26 17:39:02 -04:00
* return this.permissions.canDeactivate(this.currentUser, route.params.id);
2016-06-28 17:49:29 -04:00
* }
* }
*
* @NgModule({
* imports: [
* RouterModule.forRoot([
* {
* path: 'team/:id',
* component: TeamCmp,
* canDeactivate: [CanDeactivateTeam]
* }
* ])
* ],
2016-08-30 18:57:24 -04:00
* providers: [CanDeactivateTeam, UserToken, Permissions]
* })
2016-08-30 18:57:24 -04:00
* class AppModule {}
2016-06-28 17:49:29 -04:00
* ```
*
* You can also provide a function with the same signature instead of the class:
*
* ```
* @NgModule({
* imports: [
* RouterModule.forRoot([
* {
* path: 'team/:id',
* component: TeamCmp,
* canActivate: ['canDeactivateTeam']
* }
* ])
* ],
* providers: [
* {
* provide: 'canDeactivateTeam',
* useValue: (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => true
* }
* ]
* })
2016-08-30 18:57:24 -04:00
* class AppModule {}
2016-06-28 17:49:29 -04:00
* ```
*
* @stable
*/
export interface CanDeactivate<T> {
2016-06-08 14:13:41 -04:00
canDeactivate(component: T, route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
Observable<boolean>|Promise<boolean>|boolean;
}
/**
* @whatItDoes Indicates that class can implement to be a data provider.
2016-06-28 17:49:29 -04:00
*
* @howToUse
2016-06-28 17:49:29 -04:00
*
* ```
2016-08-30 18:57:24 -04:00
* class Backend {
* fetchTeam(id: string) {
* return 'someTeam';
* }
* }
*
* @Injectable()
* class TeamResolver implements Resolve<Team> {
2016-06-28 17:49:29 -04:00
* constructor(private backend: Backend) {}
*
* resolve(
* route: ActivatedRouteSnapshot,
* state: RouterStateSnapshot
* ): Observable<any>|Promise<any>|any {
* return this.backend.fetchTeam(route.params.id);
2016-06-28 17:49:29 -04:00
* }
* }
*
* @NgModule({
* imports: [
* RouterModule.forRoot([
* {
* path: 'team/:id',
* component: TeamCmp,
* resolve: {
* team: TeamResolver
* }
* }
* ])
* ],
* providers: [TeamResolver]
* })
2016-08-30 18:57:24 -04:00
* class AppModule {}
2016-06-28 17:49:29 -04:00
* ```
*
* You can also provide a function with the same signature instead of the class.
*
* ```
* @NgModule({
* imports: [
* RouterModule.forRoot([
* {
* path: 'team/:id',
* component: TeamCmp,
* resolve: {
* team: 'teamResolver'
* }
* }
* ])
* ],
* providers: [
* {
* provide: 'teamResolver',
* useValue: (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => 'team'
* }
* ]
* })
2016-08-30 18:57:24 -04:00
* class AppModule {}
* ```
* @stable
*/
export interface Resolve<T> {
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<T>|Promise<T>|T;
}
2016-07-26 17:39:02 -04:00
/**
* @whatItDoes Indicates that a class can implement to be a guard deciding if a children can be
* loaded.
2016-07-26 17:39:02 -04:00
*
* @howToUse
2016-07-26 17:39:02 -04:00
*
* ```
2016-08-30 18:57:24 -04:00
* class UserToken {}
* class Permissions {
* canLoadChildren(user: UserToken, id: string): boolean {
* return true;
* }
* }
*
2016-07-26 17:39:02 -04:00
* @Injectable()
2016-08-01 18:48:40 -04:00
* class CanLoadTeamSection implements CanLoad {
2016-07-26 17:39:02 -04:00
* constructor(private permissions: Permissions, private currentUser: UserToken) {}
*
* canLoad(route: Route(
* route: Route
* ): Observable<boolean>|Promise<boolean>|boolean {
2016-07-26 17:39:02 -04:00
* return this.permissions.canLoadChildren(this.currentUser, route);
* }
* }
*
* @NgModule({
* imports: [
* RouterModule.forRoot([
* {
* path: 'team/:id',
* component: TeamCmp,
* loadChildren: 'team.js',
* canLoad: [CanLoadTeamSection]
* }
* ])
* ],
2016-08-30 18:57:24 -04:00
* providers: [CanLoadTeamSection, UserToken, Permissions]
* })
2016-08-30 18:57:24 -04:00
* class AppModule {}
2016-07-26 17:39:02 -04:00
* ```
*
* You can also provide a function with the same signature instead of the class:
*
* ```
* @NgModule({
* imports: [
* RouterModule.forRoot([
* {
* path: 'team/:id',
* component: TeamCmp,
* loadChildren: 'team.js',
* canLoad: ['canLoadTeamSection']
* }
* ])
* ],
* providers: [
* {
* provide: 'canLoadTeamSection',
* useValue: (route: Route) => true
* }
* ]
* })
2016-08-30 18:57:24 -04:00
* class AppModule {}
2016-07-26 17:39:02 -04:00
* ```
*
* @stable
*/
export interface CanLoad { canLoad(route: Route): Observable<boolean>|Promise<boolean>|boolean; }