angularjs - RouterLink 中的 QueryParams 不起作用
问题描述
我在queryParams
内部传递动态生成的 URL [routerLink]
,它破坏了路由。
IE:this.url = '/question/ask?details=1'
<a [routerLink]="url"> {{ data.name }}</a>
当我们将鼠标悬停时,它看起来像这样#/question/ask%3Fdetails%3D1
,当我们单击时会中断。
PS:由于我正在传递动态 URL,因此[queryParams]
无法单独传递,但这有效:
<a [routerLink]="/question/ask" [queryParams]={details: 1}> {{ data.name }}</a>
queryParams
任何我们可以通过inside传递完整 URL 的解决方案[routerLink]
?
解决方案
简短的回答:
无论您在routerLink
指令内部传递什么,最终都会encodeURI
在已传递的值上调用函数。
长答案
发生这种情况是因为当您直接在routerLink
其中传递整个 url 时,最终会调用指令serializeUrl
方法。routerLink
哪个调用serialize
方法urlSerializer
。serialize 方法的实现如下所示。代码链接在这里
serialize(tree: UrlTree): string {
const segment = `/${serializeSegment(tree.root, true)}`;
const query = serializeQueryParams(tree.queryParams);
const fragment =
typeof tree.fragment === `string` ? `#${encodeUriFragment(tree.fragment !)}` : '';
return `${segment}${query}${fragment}`;
}
export function encodeUriFragment(s: string): string {
return encodeURI(s);
}
解决此问题的可能解决方法是,使用 angularRouter
的称为parseUrl
method 的内置方法对 URL 进行解码。这基本上可以帮助您找到and root
,等。URL
params
queryParams
零件
@Component({
...
})
export class AppComponent {
name = 'Angular 6';
url: any;
formattedUrl: any;
params: any = {};
constructor(private router: Router) {
}
ngOnInit() {
this.urlDecoder();
}
urlDecoder() {
this.url = '/a?i=1 a';
let parsedUrl = this.router.parseUrl(this.url);
console.log(parsedUrl)
const g: UrlSegmentGroup = parsedUrl.root.children[PRIMARY_OUTLET];
const s: UrlSegment[] = g.segments;
this.formattedUrl = `${s.map(p => p.path).join('/')}`; // this is required to combine all continued segment
this.params = parsedUrl.queryParams;
}
}
html
<a [routerLink]="formattedUrl" [queryParams]="params">
Link Here
</a>
推荐阅读
- angular - 浏览器和邮递员的 Cookie 到期时间不同
- facebook - 指向我的重定向页面的 Facebook 链接在桌面上打开到错误 404 页面,但不是在移动设备上
- r - 模拟事件发生次数的函数
- python-3.x - 时间和音量预测
- django - 有没有办法使用 Django 注册模板注册新用户,这会阻止他们在管理员手动审核之前登录?
- python - 每当尝试创建新目录时,python 的 azure 函数都会出错
- webpack - Webpack 4 中的自定义 terser-webpack-plugin 缓存失效
- java - SpeechClient 未在 intellij 中导入
- python-3.x - TimeoutError: Worker 启动失败
- java - 函数式编程,测试接口