Angular 角度路由器处理“/&引用;在路由器变量中

Angular 角度路由器处理“/&引用;在路由器变量中,angular,npm,hash,routes,cryptojs,Angular,Npm,Hash,Routes,Cryptojs,我一直在研究带有路由的角度项目,所以我们考虑下面这样的路由。br> { 路径:“预览/:Id”, loadChildren:()=>import('./path/preview/preview.module')。然后(m=>m.PreviewModule), } 因此,该路由可能具有字母数字值,如(a-zA-Z0-9),也可能具有特殊字符,如/,如下所示生成的散列值 preview/QQZnNw+VjBg/cAXvy6nxdiQ== 因此,在上述路径中,paramId将有一些值,如qqznw


我一直在研究带有路由的角度项目,所以我们考虑下面这样的路由。br>

{
路径:“预览/:Id”,
loadChildren:()=>import('./path/preview/preview.module')。然后(m=>m.PreviewModule),
}
因此,该
路由
可能具有字母数字值,如(a-zA-Z0-9),也可能具有特殊字符,如
/
,如下所示生成的散列值

preview/QQZnNw+VjBg/cAXvy6nxdiQ==
因此,在上述路径中,param
Id
将有一些值,如
qqznw+VjBg/cAXvy6nxdiQ==
,这就是我试图实现的

错误:但不幸的是,我在声明无法识别的路由时出错,因为上述值在其路由中有“/”。

之前我尝试过的是,我尝试过向route参数添加类似于
/:Id(/[\\S]+/g)
的正则表达式,以便它可以接受此路由

{
路径:“preview/:Id(/[\\S]+/g)”,
loadChildren:()=>import('./path/preview/preview.module')。然后(m=>m.PreviewModule),
}

请问,谁能帮我找到一个方法。

你可以使用
UrlMatcher

函数slashMatcher(路径:string,参数:string):UrlMatcher{
返回(
段:URLSEMENT[],
组:URL组,
路线:路线
):UrlMatchResult=>{
常量{length}=段;
常量firstSegment=段[0];
如果(firstSegment.path==path&&length>=2){//firstSegment.path==preview
const paramSegments=segments.slice(1);
const paramPaths=paramSegments.map(segment=>segment.path);//[“qqznw+VjBg”,“cAXvy6nxdiQ==”]
const mergedParam=paramPaths.join(“/”);//qqznw+VjBg/cAXvy6nxdiQ==
const-idSegment:urlsem分段=新的urlsem分段(mergedParam,{[param]:mergedParam});
返回{consumed:segments,posParams:{[param]:idSegment};
}
返回null;
};
}
常数路由:路由=[
{ 
匹配器:slashMatcher('preview','Id'),
loadChildren:()=>import('./path/preview/preview.module')。然后(m=>m.PreviewModule),
},
];
//组件中
const id$=this.route.paramMap.pipe(map(params=>params.get('id'));

多亏了这个,我找到了解决问题的办法

我创建了两个实用程序函数,用于在加密时用一些哈希代码替换“/”,并将哈希代码解密回“/”

convertSpecial=(文本:字符串)=>{
const ciphertext=this.encrypt(text);
返回密文。replace(//\+/g,'p1L2u3S')。replace(//\//g,'s1L2a3S4h')。replace(//=/g,'e1Q2u3A4l');
}
unconfertspecial=(密文:字符串)=>{
ciphertext=ciphertext.toString().replace(/p1L2u3S/g,“+”).replace(/s1L2a3S4h/g,“/”).replace(/e1Q2u3A4l/g,“=”);
const text=this.decrypt(密文);
返回文本;
}
因此,在重定向时


安装组件时

ngOnit()
{
this.Id=this.unconfertSpecial(this.Id);
}

为什么不使用crypto.js而不是base64生成十六进制哈希字符串?谢谢@fridoo会让你知道这是否有帮助请查看我的答案@fridoo