angular - 将 *ngFor 与迭代器一起使用的正确方法是什么?

标签 angular iterator

长话短说:
当使用带有 ngFor 的迭代器时,Angular 会引发 ExpressionChangedAfterItHasBeenCheckedError


我有一个使用 ngFor 的模板,例如:

<div *ngFor="let something of foobarIterator()">

TypeScript 代码如下:

private foobar = [];

public foobarIterator() {
    return this.foobar[Symbol.iterator]();
}

根据 Angular 文档,允许将迭代器传递给 ngForOf它确实有效……除了它在之后抛出一个 ExpressionChangedAfterItHasBeenCheckedError

虽然我知道这可能是因为每次调用该方法时我都返回一个新的迭代器实例,但我并没有得到 Angular 期望的结果。在迭代器耗尽后使用相同的迭代器实例是没有意义的——毕竟它是一个迭代器,而不是数组本身。

那么在 ngFor 中使用迭代器的正确方法是什么?

最佳答案

这个问题已经discussedsolutions proposed几次..虽然不太好找。

Angular 6.1.0 finally 提供了一个新的管道 keyvalue ( API docs ),它可以像这样用于对象和 map :

@Component({
  selector: 'keyvalue-pipe',
  template: `<span>
    <p>Object</p>
    <div *ngFor="let item of object | keyvalue">
      {{item.key}}:{{item.value}}
    </div>
    <p>Map</p>
    <div *ngFor="let item of map | keyvalue">
      {{item.key}}:{{item.value}}
    </div>
  </span>`
})
export class KeyValuePipeComponent {
  object: {[key: number]: string} = {2: 'foo', 1: 'bar'};
  map = new Map([[2, 'foo'], [1, 'bar']]);
}

关于angular - 将 *ngFor 与迭代器一起使用的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50495637/

相关文章:

unit-testing - Angular 2 单元测试 : Custom Pipe error The pipe could not be found

angular - 在剑道网格列中显示对象数组

javascript - 我可以从子组件更改父组件的 css 吗?

angular - Nav和NavController的push方法有什么区别

java - 使用迭代器将对象添加到链表

angular - 如何在 Angular 中配置辅助路由

java - 重复数据删除迭代器

c++ - 哪个 C++ 概念更适合为数据库查询建模——流或输入迭代器?

java - Java 中集合的迭代

c++ - 在字符串的每个第 n 个元素之后插入字符(不使用 stringstream)