【问题标题】:Iterating Promise<any[]> with *ngFor?用 *ngFor 迭代 Promise<any[]>?
【发布时间】:2020-03-30 06:34:19
【问题描述】:

获取一个无限循环,尝试遍历此函数调用产生的承诺:

 public CUSTOMERS = [
    {"id":1,"name":"Crypto Joe", "description":"Love Crypto in the Morning"},
    {"id":1,"name":"Crypto Sue", "description":"Love Crypto in the Evening"}
];

    loadCustomers():Promise<any[]> {
      return of(this.CUSTOMERS).toPromise()
    }

这是模板:

<li *ngFor="let customer of loadCustomers() | async">
    <h3>{{customer.name}}</h3>
    <code> {{customer.description}} </code>
</li>
</ul>

想法?这是一个 stackblitz 演示:

https://stackblitz.com/edit/minimal-angular-ngfor-loop

我更新了演示以使用changeDetection: ChangeDetectionStrategy.OnPush,但它仍然会导致无限循环。也许这只能通过 observables 来完成?

【问题讨论】:

标签: javascript angular typescript promise


【解决方案1】:

问题在于变更检测。 因此,只要将第一个客户添加到 DOM,角度就会检测到更改并调用 loadCustomers(),这会导致无限循环。

更改检测到“OnPush”或绑定到属性而不是方法或 getter。

【讨论】:

  • 我将原始演示更改为使用`changeDetection: ChangeDetectionStrategy.OnPush`,但它不起作用。知道为什么吗?
  • 正如 Philipp Meissner 已经提到的,考虑使用 observable 而不是 promise。因此,您只需使用 of(this.CUSTOMERS),该属性的类型将为 customer$: Observable。很高兴我能帮忙
  • 我想使用更改检测,您必须手动触发更改检测。在构造函数中注入 ChangeDetectorRef 并调用 changeDetection.detectChanges()。这会重新触发渲染
猜你喜欢
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 2017-03-08
  • 2018-08-29
  • 2017-07-05
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
相关资源
最近更新 更多