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

在路由器订阅中调用subscribe方法时,是否应取消对ActivatedRoute的订阅?

丘学海
2023-03-14

我读到过,通常您不必明确地取消对路由器activatedroute的订阅,因为:

ActivatedRoute及其可观察到的内容与路由器本身绝缘。当不再需要路由组件时,路由器会销毁该组件,并且注入的ActivatedRoute也会随之死亡。

this.routerSubscription = this.router.events
  .pipe(
    tap((event) => { 
      switch (true) {
        case event instanceof NavigationStart: { 
          setTimeout(() => this.showChildComponentLoading = true);
          break;
        }

        case event instanceof NavigationEnd:{
          this.activatedRoute.firstChild.paramMap.subscribe(paramMap => {
          if(paramMap.has('mode')){
              let newWebAppMode:string = paramMap.get('mode');
              if(this.dataStoreService.isValidWebAppMode(newWebAppMode) && newWebAppMode !== this.dataStoreService.currentAppMode)
                  this.saveToLocalStorage.next([DataType.WEB_APP_MODE, newWebAppMode]); 
          }
        });
//other code

每当有人导航到另一个组件/页面时,activatedroute.firstchild.parammap就会被再次订阅。只有当事件是navigationend的实例时,我才必须在路由器订阅中执行此操作,因为在此之前,url参数还不可用。

我的问题是,那些订阅会发生什么?他们是自动退订还是我需要手动退订每一个新的?如果是后者,我怎样才能有效地做到呢?

你们中的一些人可能会建议我使用activatedroute.firstchild.snapshot.parammap.myParameter,因为这样我就不用订阅任何东西了。但是,snapshot在重用同一组件时url参数发生更改时不起作用。所以我不能用那个。

共有1个答案

贺自明
2023-03-14

是的,这看起来确实像是一个潜在的内存泄漏:在每个NavigationEnd上都会产生一个新的订阅,这样您就有可能无限数量的相同的同一流的观察者(并且ActivatedRoute.FirstChild.ParamMap会无限地发出)。您可以通过在订阅中放置一个简单的console.log(new Date())来验证。

我相信switchmap是您在这里的朋友(它在订阅新流时自动退订旧流)。喜欢某事

this.router.events.pipe(
    filter(event => event instanceof NavigationEnd),
    switchMap(() => this.activatedRoute.firstChild.paramMap),
    filter(paramMap => paramMap.has('mode')),
    map(paramMap => paramMap.get('mode')),
    filter(newMode => this.dataStoreService.isValidWebAppMode(newMode) && 
        newMode !== this.dataStoreService.currentAppMode),
).subscribe(newMode => this.saveToLocalStorage.next([DataType.WEB_APP_MODE, newMode]);

顺便说一句,难道您不需要防止this.activatedroute.firstchild为空吗?

 类似资料:
  • 本文向大家介绍深入理解Angular4订阅(Subscribe)与取消,包括了深入理解Angular4订阅(Subscribe)与取消的使用技巧和注意事项,需要的朋友参考一下 订阅(Subscribe) 写过js的都知道,subscribe在很多地方都能看到它的身影,并且起到了很重要的作用。侦听http请求的返回,页面间传递参数… …说起订阅,就不能不提Observable,说起Observabl

  • 例: 注意:是非Android 运行环境, 使用的是RxJava2.x

  • 问题内容: 我试图弄清Reactor Project,现在正在寻找取消订阅的方法。我知道在进行例如Flux的订阅后,我可以获取可用于发送onCancel信号的Cancellation对象的引用,但这仅是在进行订阅之后,并且我需要将该引用保留在某种Collection中。 有更好的方法来获取Cancellation对象吗?或只是取消订阅。也许某个地方包含对所有活动订阅的引用-是的,这太棒了… 问题答

  • 本文向大家介绍system.reactive 订阅/取消订阅可观察对象(IDisposable),包括了system.reactive 订阅/取消订阅可观察对象(IDisposable)的使用技巧和注意事项,需要的朋友参考一下 示例 订阅返回IDisposable: 当您准备取消订阅时,只需处置订阅即可:            

  • Rx简介的调度和线程部分说 订阅和观察的使用只能由最终订阅者调用 它还说,在UI应用程序中,通常是最终订阅者的表示层应该是调用这些方法的层。 我想知道这个建议是否可靠,因为我看到有些情况下这样做并不方便: 首先,我不认为表示层应该决定来自数据层的可观察对象应该在哪里订阅。在我看来,表示层应该不知道数据是来自数据库、REST API还是内存。出于这个原因,数据层在返回可观察对象之前调用很方便,传递I

  • 我使用SockJS和StompJS,当我在浏览器中打开我的应用程序时,有时它会在连接到websocket之前尝试订阅一些主题。我希望主题订阅等待应用程序连接到websocket。 这就是我实现此代码的原因,我将其称为: 因此,我只在连接状态为时才订阅该主题,并且只有在客户端首次成功连接时才会调用该主题。 我想稍后从主题中取消订阅,所以我需要内部订阅返回的对象,我还需要内部订阅的消息。 我所实现的很