1

我对 Angular 还很陌生,我的问题可能看起来很基础,但我们将不胜感激。我目前正在编写一个应用程序来教自己一些真正的开发技能。在我的应用程序中,我有一个 Angular 组件,它导入了我编写的提供数据的服务。

这是我的组件

@Component({
  selector: 'music-instrument-list',
  templateUrl: './instrument-report.component.html',
  styleUrls: ['./instrument-report.component.css']
})
export class InstrumentReportComponent implements OnInit, OnDestroy {
    
    constructor(public apiService: ApiService) {}
    public availableInstruments: any[];

    ngOnInit() {
        this.apiService.getInstruments().subscribe((result) => {
            this.availableInstruments = result;
        });
    }

    ngOnDestroy() {
    // how do I unsubscribe?
    }
}

这很简单,但如果我尝试添加this.apiService.getInstruments.unsubscribe()ngOnDestroy块中,则会收到错误 P roperty 'unsubscribe' does not exist on type => Observable'。我什至考虑在类似链接.unsubscribe()之后添加,.subscribe()但这只会让我的页面挂起。我也没有错误。有人可以告诉我如何最好地退订吗?ngOnDestroy我是否需要将 api 调用分配给变量,然后在块中的变量名称上使用 .unsubscribe()

4

4 回答 4

4

为避免内存泄漏,您可以Observable通过取消订阅Subscription。例如:

    subscription: Subscription;

    ngOnInit() {
        this.subscription = this.apiService.getInstruments().subscribe((result) => {
            this.availableInstruments = result;
        });
    }

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

或使用async管道:

打字稿:

    instruments$;

    ngOnInit() {
        this.instruments$= this.apiService.getInstruments().subscribe((result) => {
            this.availableInstruments = result;
        });
    }

HTML:

    <li *ngFor="let instr of instruments$ | async">
        {{ instr | json }} 
    </li>
于 2019-08-14T11:51:05.193 回答
2
@Component({
  selector: 'music-instrument-list',
  templateUrl: './instrument-report.component.html',
  styleUrls: ['./instrument-report.component.css'],
})
export class InstrumentReportComponent implements OnInit, OnDestroy {
  subscription: Subscription;
  constructor(public apiService: ApiService) {}
  public availableInstruments: any[];

  ngOnInit() {
    this.subscription = this.apiService.getInstruments().subscribe((result) => {
      this.availableInstruments = result;
    });
  }

  ngOnDestroy() {
    this.subscription.unsubscribe();
  }
}
于 2019-08-14T11:52:25.900 回答
0

在 Angular 中处理观察者的最新和更简洁的方法是在模板组件中使用异步管道,它将订阅和可观察对象的销毁委托给容器框架。您可以在此处找到更详细的示例(角度文档): https ://angular.io/api/common/AsyncPipe

于 2019-08-14T11:58:32.867 回答
0

您不应该取消订阅自动完成的可观察对象(例如 Http、调用)。但是有必要取消订阅无限的可观察对象,例如Observable.timer(). 取消订阅 Angular HTTP 调用

至于一般取消订阅,这是一个重复的问题,并在此处回答 How to unsubscribe for an observable

于 2019-08-14T11:49:03.963 回答