当前位置: 首页 > 知识库问答 >
问题:

如何从路由解析类内部的可观察对象中退订

葛霄
2023-03-14

在ngOnDestroy方法中,我取消订阅一次已订阅的observable,否则代码会被多次执行...

ngOnInit()
{
    this.sub = this.route.params.subscribe(params => 
    {
        this.projectId = +params['id'];
        this.projectStore.project = this.projectId;

        // load data when the route changes
        this._tasksService.gettasks(this.projectId).subscribe(years => { this.tasks = years.map(y => new task(y)) }); // no need to clean up the subscription

    });
    // load data when the component is initialized
    this._tasksService.gettasks(this.projectId).subscribe(years => { this.tasks = years.map(y => new task(y)) }); // no need to clean up the subscription

}

ngOnDestroy()
{
    this.sub.unsubscribe();
}

现在我想把它放在路由器解析类中,但没有ngOnDestroy--当然--只有一个NavigationEnd事件,我可以再次订阅。

这意味着我订阅了一个NavigationStart事件(当我离开路由时发生),以便取消订阅另一个订阅,即路由参数更改订阅哈哈哈...

我想这不是一个好办法,但谷歌什么也没有提供。

  constructor(private service: TasksService, private router: Router)
  {

   this.navigationEnded = this.router.events
      .filter(event => event instanceof NavigationStart)
      .map(() => this.router.routerState.root)
      .subscribe((event) =>
      {
         this.navigationEnded.unsubscribe();
      });
  }
  this.route.params.subscribe(params => 
    {
         // reload data by the new id parameter does not work with params
         // I have to use inside here: route.params['id']
    });

params数组中没有id,它的长度仅为0。

相反,我必须在params订阅中使用route.params['id'],但为什么呢?

共有1个答案

广乐邦
2023-03-14

您可以只使用first()运算符。这样,可观察到的在第一个事件之后完成。不需要以这种方式退订:

this.router.events
  .filter(event => event instanceof NavigationStart)
  .map(() => this.router.routerState.root)
  .first()
  .subscribe((event) =>
  {
     //this.navigationEnded.unsubscribe();
  });
 类似资料:
  • 我有一个组件订阅服务中的一个可观察对象。该方法反过来订阅另一个服务中的可观察对象。我想将一个数组从最后一个服务传递回第一个服务,然后第一个服务将该数组传递回组件。更具体地说,该组件调用其本地服务,然后调用一个数据服务,该数据服务通过http客户端访问我的数据库。http客户端正在工作,数据服务将数组返回给本地服务。本地服务接收数组,但我不知道如何将该数组作为可观察对象传递回组件。以下是简短的代码块

  • Observables 是多个值的惰性推送集合。它填补了下面表格中的空白: 单个值 多个值 拉取 Function Iterator 推送 Promise Observable 示例 - 当订阅下面代码中的 Observable 的时候会立即(同步地)推送值1、2、3,然后1秒后会推送值4,再然后是完成流: var observable = Rx.Observable.create(functio

  • 我正在努力理解如何合并两个可观察对象并利用它们合并后的产品。我在mergeMap、switchMap、flatMap、大理石图等上看了无数视频,但我仍然不知道合并观测值是如何工作的。我觉得在使用RxJS的时候,我不会有效率,甚至不会正确。 我有一个要订阅的可观测值,我还想订阅代码中特定表单数组的valueChanges可观测值。但是,我需要确保只有在正确构建表单数组之后才能进行第二次订阅,否则将出

  • 我有一个servers对象数组,其中在数组中有另一个可观察对象数组,其键是[securityGroups]。 我有另一个securitygroupsArray数组,在这里我使用API来获取所有SecurityGroups。 我需要在securityGroups键中查找服务器阵列中该服务器上安全组的所有名称,并在一个选项中只显示我的其他阵列(securityGroupArray)的ngfor的不同名

  • 我正在从事一个涉及Hystrix的项目,我决定使用RxJava。现在,忘记Hystrix的其余部分,因为我相信主要问题是我完全搞砸了正确编写可观察代码。 需要:我需要一种方法来返回一个代表多个可观察对象的可观察对象,每个可观察对象都运行一个用户任务。我希望该可观察对象能够返回任务的所有结果,甚至错误。 问题:可观测流会因错误而消亡。如果我有三个任务,而第二个任务引发了一个异常,那么即使第三个任务成