【问题标题】:Angular Router URL Encoding Special Characters and Browser BehaviorAngular Router URL 编码特殊字符和浏览器行为
【发布时间】:2018-08-30 10:32:06
【问题描述】:

我只是想不出解决此类问题的方法。我正在设计搜索引擎,我想在 url 中显示用户试图找到的内容:

https://my-site.com/search;query=%28rockstar;search=true;page=0

用户正在尝试查找(rockstar 短语。

当我将此网址粘贴到浏览器时,它按预期工作,但 Chrome 浏览器显示此网址如下:

https://my-site.com/search;query=(rockstar;search=true;page=0

所以%28 更改为(。我不知道这种行为是否依赖于 Angular 或浏览器。当我有 ( 的 url 时,刷新 F5 不起作用,因为 Angular 路由器报告这样的问题:

Cannot match any routes. URL Segment: 'rockstar;search=true;page=0'

从 url 地址栏复制链接也是无用的,因为这种行为复制的链接包含( 字符(不是%28)。如何防止url地址栏中的%28等特殊字符不被浏览器解码?问题出现在 Angular v5.2.5

这里是这个问题的演示:https://angular-url-problem.stackblitz.io

请注意,在 Angular 6 中该问题不存在:https://angular-url-problem-v6.stackblitz.io

【问题讨论】:

  • 你能用最少的代码创建一个 StackBlitz 来重现问题吗?
  • 如果没有人知道这个问题的答案,那么我会尽力提供。
  • @MarcinKapusta How to Ask 另有说明:Help others reproduce the problem。请提供minimal reproducible example,以便我们无需自己实现即可对其进行测试(我坚持使用Verifiable,这意味着您必须重现该问题,而不仅仅是提供堆栈闪电)
  • 我问是因为我无法重现您的问题。如果我加载 angular-hzu1wi.stackblitz.io/… 它工作正常。
  • 您无法重现,因为您在? 字符后使用查询参数。

标签: angular typescript angular-routing angular-router


【解决方案1】:

它不起作用,因为您没有查看正确的参数。如您所见,在this stackblitz 中,您甚至不需要对参数进行编码。

您也无需费力地创建查询参数。 Angular 提供了高级别的抽象,利用它来发挥你的优势。

ngOnInit(): void {
  this._route.queryParamMap
    .subscribe(params => {
      this.form.patchValue({
        query: params.get('query') || '',
      });
    });
}

public onSubmit(): void {
  const query: string = this.form.value.query;
  this._router.navigate(['/search'], {
    queryParams: {
      query
    }
  })
}

EDIT 使用矩阵表示法:stackblitz

ngOnInit(): void {
  this._route.params
    .subscribe(params => {
      this.form.patchValue({
        query: params['query'] || '',
      });
    });
}

public onSubmit(): void {
  const query: string = this.form.value.query;
  this._router.navigate(['/search', { query }]);
}

【讨论】:

  • 但这不是我所期待的。您为我提供了一个添加查询参数的解决方案(在? 字符之后)。这是完全不同的解决方案。
  • With matrix notation 如果你愿意的话。我的观点仍然有效。
  • 这是 Angular 6 解决方案,我需要 Angular 5 解决方案。我写道,在 Angular 6 中一切正常。看看问题描述,因为我更新了它。
  • 那么这是一个问题,您需要升级到 Angular 6(对不起,没有再阅读您的问题,我的错)。
  • 目前我无法更新到 Angular 6,这就是我问的原因:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
相关资源
最近更新 更多