angular - 如何从服务器实现动态路由而不会刷新失败?
问题描述
我的应用程序的权限动态来自服务器,所以我想到的自然实现是在我按下导航栏中任何项目的 url 之前修改路由器树(使用 Router.config)。这是我从服务器获取数据后的 setRoutes 函数,然后我按下导航栏上的任何项目:
setRoutes ( data ) {
data.map ( module => {
module.menus.map ( menu => {
menu.programs.map ( program => {
programs.push (
{
moduleCode : module.code ,
menuCode : menu.code ,
programCode : program.code ,
programLabel : program.dsc,
formType: program.formType
}
);
} );
} );
} );
});
let children = programs.filter(program => program.formType == 'DynamicForm').map ( program => {
if(program.formType == "DynamicForm"){
return {
path : program.programCode ,
children : [
{
path : "edit" ,
component : UpdateRecordComponent,
data : { program : program }
} , {
path : "queryForm" ,
component : DynamicProgramComponent ,
data : { program : program }
} , {
path : "add" ,
component : AddRecordComponent ,
data : { program : program }
} , {
path : "" ,
redirectTo : "queryForm"
}
]
};
}
} );
this.router.config.forEach ( route => {
if ( route.path === "app" ) {
route.children.forEach ( child => {
if ( child.path === "main" ) {
child.children = [...child.children , ...children];
}
} );
}
} );
如果我逐步进入应用程序,一切都很好(登录 => 填写路线和导航 => 按下并导航到某个页面)
我的问题是当我在某个页面刷新页面或尝试通过链接访问它时。路由器树变空并且应用程序抛出错误(无法匹配到 URL 段的任何路由),然后我才能执行任何代码,例如设置在 url 事件开始之前首先路由。
我尝试使用 APP_INITIALIZER,但是当我尝试执行 APP_INITIALIZER 服务中的代码时,路由器服务或任何自定义服务未定义
我的角度问题有什么解决方案吗
解决方案
您可以使用angular route guards代替动态路由。特别是看canActivate。
canActivate,可以为每个路由或子路由调用,并期望返回布尔值的布尔值或 Observable。
这样,您要做的是,已经定义了一个路由列表。在您的路由 gurad 中,您可以最初从服务器获取权限并将它们存储在本地(可能是本地存储),然后测试是否允许用户访问该路由。