angular - ngFor block 内模板中的异步管道触发 http GET 调用循环

标签 angular typescript observable rxjs5

我有以下组件模板:

<div *ngFor="let ctrl of data; trackBy:ctrl?.Id">
   <div *ngIf="getNext(ctrl.nextDate) | async as next">
        <span>{{next | date: 'dd.MM.yyyy'}}</span>
   </div>
</div>

getNext() 是一个返回 Observable<Date> 的简单方法:

public getNext(deadline: string): Observable<Date> {
   return this.http.get<Date>(`${this.config.apiEndpoint}/api/meeting?deadline=${deadline}`);
}

我的目标是调用该方法并使用模板中的异步管道订阅可观察对象。但是,当我运行应用程序时,会生成无休止的 GET 和 OPTIONS 请求。

另外,如果我将方法调用放在 ngFor 之外,也会发生同样的情况。该调用需要在 ngFor 内部执行,因为每个集合项的参数都不同。

为什么订阅后只调用一次,不再调用?

最佳答案

在模板中调用函数通常不是一个好主意,因为它会导致不可预知的结果。这是重构代码以避免这种情况的方法:

data: any = [....] // some data
data$: Observable[];

ngOnInit() {
    this.data$ = this.data.map(elem => this.getNext(elem));
} 

public getNext(deadline: string): Observable<Date> {
   return this.http.get<Date>(`${this.config.apiEndpoint}/api/meeting?deadline=${deadline}`);
}

在你的模板中:

<div *ngFor="let ctrl of data$">
   <div *ngIf="ctrl | async as next">
        <span>{{next | date: 'dd.MM.yyyy'}}</span>
   </div>
</div>

这是我创建的一个 stackblitz,您可以在其中看到类似机制的工作原理:https://stackblitz.com/edit/angular-nyn4qz

关于angular - ngFor block 内模板中的异步管道触发 http GET 调用循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48813002/

相关文章:

angular - Stackblitz:找不到空包

java - 将 ListView 绑定(bind)到 ObservableSet

javascript - combineLatest 重置 observable - Rxjs

javascript - RxJS forkJoin 会按顺序返回结果吗?

angular - @ngrx/effects 给出 TypeError : You provided 'undefined' where a stream was expected. 您可以提供 Observable、Promise、Array 或 Iterable

angular - 在 Stackblitz Angular 项目中使用 Object.values()

angular - NullInjectorError : No provider for InjectionToken MatDialogData

javascript - 使用 Angular 6 插入数据时更新数据表

angular - 汇总和 Redux : "index.js does not export default"

javascript - 使用 AOT 编译创建可重用的动画