Angular 角度6:基于URL参数更改组件内容,内容更改滞后

Angular 角度6:基于URL参数更改组件内容,内容更改滞后,angular,rxjs,observable,Angular,Rxjs,Observable,在我的ngOnInit中,我订阅了一项服务,映射出一个对象,并在模板中呈现所述对象 ngOnInit() { this.id = +this.route.snapshot.paramMap.get('id'); this.privateService.someService(this.id) .pipe( take(1) ) .subscribe( (response) => { this.

在我的ngOnInit中,我订阅了一项服务,映射出一个对象,并在模板中呈现所述对象

  ngOnInit() {
    this.id = +this.route.snapshot.paramMap.get('id');
    this.privateService.someService(this.id)
      .pipe(
        take(1)
      )
      .subscribe(
      (response) => {
        this.mapRes = response;
        }
      )
  }
当url参数中的id更改时,我将根据新id更改模板中的数据。我还将使用rxjs take()运算符使异步操作更简单,时间更短。但是,这种滞后仍在继续。从我将url参数更改为使用新数据重新呈现的模板时起,几乎需要一秒钟的时间

ngDoCheck() {
   let tempId = +this.route.snapshot.paramMap.get('id');
    if(this.id === tempId) {
      return;
    }
    else {
      this.privateService.someService(this.id)
      .pipe(
        take(1)
      )
      .subscribe(
      (response) => {
        this.mapRes = response;
        }
      )
      this.id = tempId;
    }
  } 
我认为这种延迟正在发生,因为我仍然订阅了ngOnIt中的某项服务,然后我在ngDoCheck()钩子中重新订阅该服务

如何在不使用正在销毁的组件(这里就是这种情况)的情况下取消订阅服务,以便使用不同的数据重新呈现相同的组件

编辑:
我想知道我的问题是否是模板更改改变了实际的dom,这是延迟的来源而不是流?因为在触发ngDoCheck后,我使用take()操作符只返回1个对象,因此流理论上停止

是的,ngDoCheck中的重新订阅可能会创建许多订阅,并且取决于屏幕上一次有多少组件实例,这个问题会成倍增加。但真正的问题是,每次ngDoCheck触发时,您都试图处理一个服务调用。如果您在回调中放入console.count,我敢打赌您会看到服务调用启动了许多请求。相反,在init上,您需要通过订阅route.params或route.paramsMap或router.events来订阅路由的更改。由于paramsMap是一个异步的可观察对象,它可能会立即转到您的
else
块,并在每个doCheck上发出请求。

嘿,谢谢您的反馈。route.params.subcribe在延迟方面没有任何变化。这是我在尝试ngDoCheck钩子之前实现的第一个解决方案,但在减少延迟方面运气不佳。我想知道我的问题是否是模板更改改变了实际的dom,这是延迟的来源而不是流?因为在触发ngDoCheck之后,我使用take()操作符只返回1个对象,所以流理论上停止