angular 2+ 路由守卫
1. 定义接口名称 /domain/login-guard.ts
export interface LoginGuard {
data: any;
msg: string;
status: boolean;
}
2. 定义actions /ngrx/actions/login-guard.action.ts
import { Action } from '@ngrx/store';
import {LoginGuard} from '../../domain/login-guard';
/**
* For each action type in an action group, make a simple
* enum object for all of this group's action types.
*/
export enum ActionTypes {
GUARD = '[GUARD]'
};
/**
* Every action is comprised of at least a type and an optional
* payload. Expressing actions as classes enables powerful
* type checking in reducer functions.
*/
export class GuardSuccess implements Action {
readonly type = ActionTypes.GUARD;
constructor(public payload: LoginGuard) { }
}
/**
* Export a type alias of all actions in this action group
* so that reducers can easily compose action types
*/
export type Actions
= GuardSuccess;
3. 定义reducers /ngrx/actions/login-guard.reducer.ts
import * as fromLogin from '../actions/login-guard.action';
import {LoginGuard} from '../../domain/login-guard'; export interface State {
guard: LoginGuard;
} export const initialState: State = {
guard: {
data: '',
msg: '',
status: true
}
}; export function reducer(state = initialState, action: fromLogin.Actions): State {
switch (action.type) {
case fromLogin.ActionTypes.GUARD: {
return {...state, guard: action.payload};
}
default: {
return state;
}
}
}
4. login.service.ts
import {Injectable} from '@angular/core';
import {ActivatedRouteSnapshot, NavigationEnd, Router, RouterStateSnapshot} from '@angular/router';
import {Observable} from 'rxjs/Observable';
import 'rxjs';
import {HttpClient} from '@angular/common/http';
import * as fromReducer from '../ngrx/reducers/index';
import {Store} from "@ngrx/store";
import {GuardSuccess} from '../ngrx/actions/login-guard.action';
export class LoginService {
constructor(private router: Router, private http: HttpClient, private store$: Store<fromReducer.State>) {
}
// canActivate: 控制是否允许进入路由。
canActivate(route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
return this.activate();
}
// 在登陆的时候会把登陆信息存到浏览器localStorage,退出登陆时remove掉,如果是直接打开地址而没有登陆的话,会跳到登陆界面,judgeuser是请求用户信息接口,setUserInfo()把请求到的信息存到浏览器
activate(): Observable<boolean> {
const url = `${environment.path}/judgeUser`;
const params = JSON.parse(localStorage.getItem('LOGININFO'));
const param = {
emNumber:params.emNumber,
emPhone:params.emPhone
}
return this.http.post(url, param).map((guard: LoginGuard) => {
const guard$ = guard;
if (!guard$.status) {
this.router.navigate(['/']);
}
setUserInfo(guard$);
this.store$.dispatch(new GuardSuccess(guard$));
return guard$.status;
});
}
}
5. service注入
import {LoginService} from './service/login.service';
@NgModule({
declarations: [
AppComponent,
DemoComponent,
// HtmlPipe
],
imports: [
BrowserAnimationsModule,
AppRoutingModule,
ViewModule,
ShareModule,
AppStoreModule,
HttpClientModule,
DirectivesModule,
],
providers: [LayerService, InterfaceService, LoginService, {
provide: LocationStrategy,
useClass: HashLocationStrategy
}],
bootstrap: [AppComponent]
})
export class AppModule { }
angular 2+ 路由守卫的更多相关文章
- Angular 4 路由守卫
路由守卫 只有当用户已经登录并拥有某些权限时才能进入某些路由 一个有多个表单组成的向导,如注册流程,用户只有在当前组件的组件中填写了满足要求的信息才可以导航到下一个路由 当用户未执行保存操作而试图离开 ...
- Angular4.x通过路由守卫进行路由重定向,实现根据条件跳转到相应的页面
需求: 最近在做一个网上商城的项目,技术用的是Angular4.x.有一个很常见的需求是:用户在点击"我的"按钮时读取cookie,如果有数据,则跳转到个人信息页面,否则跳转到注册 ...
- angular路由详解六(路由守卫)
路由守卫 CanActivate: 处理导航到某个路由的情况. CanDeactivate:处理从当前路由离开的情况. Resole:在路由激活之前获取路由数据. 1.CanActivate: 处理导 ...
- angular路由守卫
路由守卫是指当用户满足了某些要求之后才可以离开或者进入某个页面或者场景的时候使用.比如说只有当用户填写了用户名和密码之后才可以进入首页,比如说用户离开某个页面时明月保存信息提示用户是否保存信息后再离 ...
- Angular路由——路由守卫
一.路由守卫 当用户满足一定条件才被允许进入或者离开一个路由. 路由守卫场景: 只有当用户登录并拥有某些权限的时候才能进入某些路由. 一个由多个表单组成的向导,例如注册流程,用户只有在当前路由的组件中 ...
- Angular路由守卫 canActivate
作用 canActivate 控制是否允许进入路由. canActivateChild 等同 canActivate,只不过针对是所有子路由. 关键代码 创建路由守卫 import { Injecta ...
- Angular路由守卫 canDeactivate
目的 离开页面时,做出逻辑判断 以ng-alain的项目为基础做演示 效果如图: 关键代码 定义一个CanDeactivateGuardService export class CanDeactiva ...
- Angular 路由守卫
1. 路由 Angular路由: 可以控制页面跳转:可以在多视图间切换: 2. 路由守卫 Angular路由守卫: 在进入或离开某路由时,用于判断是否可以离开.进入某路由::: return true ...
- Angular 从入坑到挖坑 - 路由守卫连连看
一.Overview Angular 入坑记录的笔记第六篇,介绍 Angular 路由模块中关于路由守卫的相关知识点,了解常用到的路由守卫接口,知道如何通过实现路由守卫接口来实现特定的功能需求,以及实 ...
随机推荐
- VirtualBox虚拟机扩容
1. 在VBox下增加储存 如图,未扩容前是40G 打开cmd命令行(win+r 输入cmd打开) 将目录切换到virtual的安装目录 cd C:\Program Files\Oracle\Vir ...
- php类自动载入
在编写面向对象(OOP) 程序时,很多开发者为每个类新建一个 PHP 文件. 这会带来一个烦恼:每个脚本的开头,都需要包含(include)一个长长的列表(每个类都有个文件). 在 PHP 5 中,已 ...
- StrongLoop
http://loopback.io/getting-started/ 使用 StrongLoop 创建 Node.js MySQL 应用程序 StrongLoop 是 IBM 的一家子公司,Stro ...
- UIView总结
转自:http://langhua9527.iteye.com/blog/1377741 如果想调用某个类的某个方法可以写成这样,这个方法来自NSObject类 performSelector: pe ...
- 2014 Multi-University Training Contest 1/HDU4864_Task(贪心)
解题报告 题意,有n个机器.m个任务. 每一个机器至多能完毕一个任务.对于每一个机器,有一个最大执行时间Ti和等级Li,对于每一个任务,也有一个执行时间Tj和等级Lj.仅仅有当Ti>=Tj且Li ...
- swift 单例模式
class ca{ ; static var instance:ca = ca(); class func GetInstance()->ca{ return instance; } } var ...
- 简单集成高大上的ImagePicker无标题文章
简单集成高大上的ImagePicker无标题文章 现在是个项目就要有图片上传所以下面介绍一下简单高端的图片选择器 感谢读者的细心发现bug,最近bug已经修复(github更新)所以对文章部分内容 ...
- vue-tree
vue-tree vue 编写的树形菜单,小巧实用,支持vue1.0,vue2.0 v1.0 功能: 1.支持多级树目录 2.支持高亮点击的节点 3.支持展开点击节点 4.支持点击收缩节点时收缩所有子 ...
- SQL Server 2008 允许远程链接 解决方法
用户在使用SQL Server 2008远程链接时,可能会弹出如下对话框: 在链接SQL服务器时发生网络链接错误或特定实例错误.SQL服务器不存在或者链接不成功.请验证用户名是否正确或SQL服务器是否 ...
- JS PHP MySQL 字符长度
摘要: js的string.length 属性取的是字符串的实际长度 php的str_len()函数取的是字符串的字节长度,中文utf-8占3个字节,gb2312占2个字节 mysql中的varcha ...