【问题标题】:Change subscription of Angular2 Async Pipe更改 Angular2 异步管道的订阅
【发布时间】:2017-02-14 10:55:33
【问题描述】:

我有一个案例,我在 angular2 组件中使用异步管道并将 observable 传递给它。效果很好。

我想要的是稍后,当组件仍然“活动”时,即:尚未调用 OnDestroy(因此订阅了异步管道),取消订阅该 observable 并订阅另一个。

我怎样才能做到这一点?

这里有一些伪代码来揭露这个案例:

@Component({
  selector: 'pack',
  template: `
    <wolf *ngFor="let wolf of pack | async">
      ...
    </wolf>
  `
})
export class PackComponent implements DoCheck {

    pack;

    constructor(){
      this.pack = Observable.of(northwesthernWolves: Wolf[])
    }

    onDoCheck() {
      if(some condition) {
        this.pack = Observable.of(redWolves: Wolf[])
      }
    }
}

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    考虑到框架已经发布,可以安全地假设它已经处理了这个问题。实际上,it is so:

    ...
    if (obj !== this._obj) {
      this._dispose();
      return this.transform(obj);
    }
    ...
    

    当新的 observable 被分配给类属性时,旧的 observable 会被async pipe 自动取消订阅。

    相反的行为会导致内存泄漏,并可能被视为错误。

    【讨论】:

    • 这没有回答。我需要更改组件类中的异步订阅。这些方法在异步管道类中声明并运行。
    • 答案的重点是你不需要关心这个,当你做this.pack = Observable.of(redWolves: Wolf[])时框架会为你做这件事。是什么让您认为您需要手动取消订阅?您发布的代码是否存在相关问题?
    • 当我这样做时,我的浏览器被阻止了。我有一个需要更改组件类中的订阅的情况。我会详细说明:我的初始订阅是一个 SSE 事件,但我也对一个 promise 运行回调(都到服务器)。虽然 SSEvents 流工作正常,但我想在调用回调后将管道订阅重置为返回的承诺(一个数组)。我相信我可能必须取消订阅才能这样做,但我不确定。
    • 正如答案所解释的,您不需要手动执行此操作,当将新的 observable 分配给类属性时,异步管道会自动取消订阅旧的 observable。问题可能出在其他地方。
    • 但异步管道在调用 OnDestroy 时取消订阅,以防止内存泄漏。为什么说变量重新赋值时调用 unsubscribe 方法?
    猜你喜欢
    • 1970-01-01
    • 2019-05-06
    • 2020-11-13
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2017-11-30
    相关资源
    最近更新 更多