【问题标题】:Angular 9 Redirect if query param not provided如果未提供查询参数,则 Angular 9 重定向
【发布时间】:2020-09-21 02:18:34
【问题描述】:

我有一个路由,只有当用户单击电子邮件中的链接并使用 url 中的有效查询参数重定向时,他们才能访问该路由。如果没有提供参数,我想重定向到 404 页面未找到组件,如下所示。

this.route.queryParams.subscribe(params => {
      if (params.myParam) {
        //do something
      } else {
        // redirect to 404
      }
    })

我遇到的问题是查询参数在 ngOnInit() 中被初始化为一个空对象。我已经使用 rjxs 来等待参数可以像这样访问

this.route.queryParamMap.pipe(
      filter(paramMap => paramMap.has('myParam')),
      map(paramMap => paramMap.get('myParam')),
      take(1)
    ).subscribe(myParam => doSomething(myParam));

但是我对 rxjs 操作符不是很精通,现在我被困在 paramMap 已经完成初始化并且找不到参数的情况下如何实际重定向。

【问题讨论】:

  • “查询参数在 ngOnInit() 中被初始化为空对象”是什么意思? ngOnInit 在同一个组件中?
  • 如果我像这样订阅 ngOnInit 中的 queryParams,this.route.queryParams.subscribe(console.log),它第一次发出时,我看到了{}
  • 解决 this.route.snapshot.queryParms 并告诉我你看到了什么
  • @Flightdoc5242 {},使用路线localhost:4200/?myParam=464f4e2a-a0fa-4cd8-baf2-a8945cfb2aaf

标签: angular rxjs


【解决方案1】:

这是许多应用程序中的问题,因为参数和查询参数是作为行为主体实现的,通过等待NavigationEnd 事件来解决这个问题,其中查询参数肯定已经设置...

   const navEnd$ = this.router.events.pipe(filter(e => e instanceof NavigationEnd));
   navEnd$.pipe(withLatestFrom(this.route.queryParams)).subscribe(
     ([navEnd, queryParams]) => {
       if (queryParams.myParam) {
         // do the thing
       } else {
         // navigate
       }
     }
   )

【讨论】:

  • 很高兴为您提供帮助,如果您想捕获所有查询参数映射更改,您可以使用 combineLatest 而不是 withLatestFrom 达到相同的效果。或者如果您只想要 1,只需添加您的 takefirst 运算符
【解决方案2】:

如果未设置 queryParam,要路由到 404,请执行以下操作:

import { Router } from '@angular/router'

class ...

constructor(private router: Router, private route: ActivatedRoute){
this.route.queryParamMap.pipe(
  skip(1),
  map(paramMap => paramMap.get('myParam')),
  tap(param=>{if(param=={} || param==undefined)this.router.navigateByUrl("/404.html")})
).subscribe(myParam => doSomething(myParam));

}

您可以在构造函数中启动订阅,这样您将获得第一个值,然后再通过任何其他方法(如 ngOninit)进行修改。

【讨论】:

  • 如果参数被排除,这将永远不会发出?
  • 它会发出,但我们在pipe 中使用tap 运算符来检查参数是否设置并相应地重定向。
  • 您已经明确过滤了没有参数myParam 的任何内容,因此如果将其排除在外,它将永远不会发出。测试代码。
  • 编辑也没有解决问题,导航总是会发生,queryParamMap 被实现为行为主体并发出一个可能为空的初始值。这在许多应用程序中都存在问题。
  • 仍然无法工作...如果查询参数确实为空,则跳过初始发出并且主题永远不会再次发出,这是一个令人沮丧的怪癖,但角度团队说这是必要的
猜你喜欢
  • 1970-01-01
  • 2012-05-28
  • 2021-10-19
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
相关资源
最近更新 更多