Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 调用router.navigate inside Guard.CanActivate方法是否正确?_Angular_Rxjs_Ngrx - Fatal编程技术网

Angular 调用router.navigate inside Guard.CanActivate方法是否正确?

Angular 调用router.navigate inside Guard.CanActivate方法是否正确?,angular,rxjs,ngrx,Angular,Rxjs,Ngrx,我与ngrx商店有一个项目,包括其所有相关实体(效果、还原剂、动作)。 其中大多数都是登录/注销/登录成功/登录直接操作,非常简单 在我们的项目中,我们有不同类型的角色(管理员、候选人、经理等)。我需要实现的是针对不同角色的不同主页。我的登录/登录成功操作/还原程序/效果如下所示: 一些代码列表: 效果: @Injectable() 导出类AuthEffects{ 登录$=createEffect(()=> 此.actions$管道( 类型(LoginPageActions.login), 映射

我与ngrx商店有一个项目,包括其所有相关实体(效果、还原剂、动作)。 其中大多数都是登录/注销/登录成功/登录直接操作,非常简单

在我们的项目中,我们有不同类型的角色(管理员、候选人、经理等)。我需要实现的是针对不同角色的不同主页。我的登录/登录成功操作/还原程序/效果如下所示:

一些代码列表: 效果:

@Injectable()
导出类AuthEffects{
登录$=createEffect(()=>
此.actions$管道(
类型(LoginPageActions.login),
映射((操作)=>action.credentials),
排气图((认证:凭证)=>
这个.authService.login(auth.pipe)(
map((user)=>AuthApiActions.loginsAccess({user,redirect:true})),
catchError((error)=>of(AuthApiActions.loginFailure({error})))
)
)
)
);
LoginSAccess$=createEffect(
() =>
此.actions$管道(
类型(AuthApiActions.loginsAccess),
点击((道具)=>{
开关(Object.keys(props.user.user.role)[0]){
个案"候选人":
this.router.navigate(['/main user']))
console.log('重定向到候选者')
打破
案例“管理”:
this.router.navigate(['/main admin']))
console.log('重定向到admin')
打破
}
//return!!props.redirect&&this.router.navigate(['/'))
})
),
{调度:false}
);
您可能会注意到,在登录成功效果中,我根据用户角色进行路由器重定向。这是好的还是糟糕的做法?我需要我的应用程序在用户登录后加载不同的主页,我想不出任何其他地方可以实现这一点。如果我可以像这样加载路由模块中的不同组件,那将是完美的:

{
路径:“家”,
如果(fromAuth.selectRole=='admin')
组件:HomePageAdmin
else if(fromAuth.selectRole==“候选者”)
组件:主页候选
}
因为我将来也需要使用不同的标题组件(带有不同的菜单项)

一些清单: 减速器:

export const loginPageFeatureKey='loginPage';
导出接口状态{
错误:字符串| null;
待定:布尔型;
}
导出常量initialState:状态={
错误:null,
待定:错误,
};
export const reducer=createReducer(
初始状态,
在(LoginPageActions.login)上,(状态)=>({
……国家,
错误:null,
待定:正确,
})),
on(AuthApiActions.loginsAccess,(状态)=>({
……国家,
错误:null,
待定:错误,
})),
on(AuthApiActions.loginFailure,(state,{error})=>({
……国家,
错误,
待定:错误,
}))
);
没什么特别的

在Route Guards中进行重定向是否正确?我已经阅读了许多关于如何实现基于角色的路由的文章,许多文章都在讨论CanActivate方法。所以我也在那里进行了重定向。唯一与我的情况不同的是,我是通过选择器从存储中检索用户角色,而在文章中是通过ia服务。如果我的存储中有用户角色数据,那么通过选择器获取用户角色是正确的吗?或者我应该通过服务重构它(打破存储状态?)?您可以在下面看到角色选择器(selectRole)是如何实现的(我不喜欢它)

选择器列表:

import*as fromAuth from./auth.reducer';
从“./login page.reducer”导入*作为从login页面导入;
导出常量authFeatureKey='auth';
导出接口身份验证状态{
[fromAuth.statusFeatureKey]:fromAuth.State;
[fromLoginPage.loginPageFeatureKey]:fromLoginPage.State;
}
导出接口状态扩展自root.State{
[authFeatureKey]:AuthState;
}
//tslint:禁用下一行:typedef
导出函数缩减器(状态:AuthState |未定义,操作:操作){
返回合并器({
[fromAuth.statusFeatureKey]:fromAuth.reducer,
[fromLoginPage.loginPageFeatureKey]:fromLoginPage.reducer,
})(国家、行动);
}
导出常量selectAuthState=createFeatureSelector(
authFeatureKey
);
导出常量selectAuthStatusState=createSelector(
选择AuthState,
(状态)=>state.status
);
export const selectUser=createSelector(
选择AuthStatusState,
fromAuth.getUser
);
export const selectRole=createSelector(
选择用户,
(用户)=>{
如果(用户)
返回Object.keys(user.user.role)[0]
返回未定义
}
)
export const selectLoggedIn=createSelector(selectUser,(user)=>!!user);
export const selectLoginPagentate=createSelector(
选择AuthState,
(state)=>state.loginPage
);
export const selectLoginPageError=createSelector(
选择LoginPeartate,
fromLoginPage.getError
);
export const selectLoginPagePending=createSelector(
选择LoginPeartate,
fromLoginPage.getPending
);
最后是RedirectGuardService,它应该在用户路由页面时重定向

canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察的|承诺|布尔值{
归还这个.store.pipe(
选择(从auth.selectRole),
过滤器(角色=>!!角色),
地图((角色)=>{
交换机(角色){
案例“管理”:
this.router.navigate(['/main admin']))
打破
个案"候选人":
this.router.navigate(['/main user']))
打破
}
返回真值
}),
以(1)为例,
)
}

我不喜欢CanActivate应该返回true/false,我只做router.navigate,它永远不会返回。对吗?如果不对,我如何在通过selector从store获取角色时实现路由重定向?selectRole。一些伪代码将是一个很好的例子。

从7.1 Angular版本开始,您可以金塔在加拿大
this.router.parseUrl('/main-admin')