在迭代期间通过角度2中的映射键检查表达式后发生了变化

Yur*_*hok 11 typescript angular

我不明白为什么我会收到错误.我的地图没有改变.

检查后表情发生了变化.上一个值:'[object Map Iterator]'.当前值:'[object Map Iterator]'

<tr *ngFor="let author of bindedAuthors.keys()">
  <td> {{author}}</td>
  <td>
    <button (click)="onUpdate(author)"
            class="btn gl-btn-primary">Update
    </button>
  </td>
  <td>
    <button (click)="onDelete(author)" class="btn gl-btn-default">Delete</button>
  </td>
</tr>
Run Code Online (Sandbox Code Playgroud)

结果是预期的,所有数据都会显示,但每次都会出现这个错误.

Gün*_*uer 22

不要绑定到...keys()模板中的方法.每次更改检测运行时都会调用它. object.keys()每次调用它时都会返回一个新对象,Angular会将其识别为意外更改,从而导致您的错误.

你可以解决它

someMethod() {
  this.bindedAuthorsKeys = this.bindedAuthors.keys();
}
Run Code Online (Sandbox Code Playgroud)
*ngFor="let author of bindedAuthorsKeys"
Run Code Online (Sandbox Code Playgroud)

  • `this.bindedAuthorsKeys = Array.from(this.bindedAuthors.keys());`将Iterable转换为数组 (4认同)
  • 谢谢你的建议!它对我来说很有效,但有一点修复。bindedAuthors是Map和方法keys()返回Iterable类型。而且,如果我不将Iterable转换为数组(我使用Array.from()),它将无法正常工作。没有转换,我得到空表。 (3认同)

Tas*_*Tas 6

我的地图是从Firestore自动同步的当前数据的主要来源。如果我按照 Günter 接受的答案中的建议进行操作,则必须确保此数组与我的地图保持同步。取而代之的是,我keyvalue直接将 Angular的内置管道与地图一起使用,如下所示:

<tr *ngFor="let author of bindedAuthors | keyvalue">
  <td> {{author.value}}</td>
  <td>
    <button (click)="onUpdate(author.value)"
            class="btn gl-btn-primary">Update
    </button>
  </td>
  <td>
    <button (click)="onDelete(author.value)" class="btn gl-btn-default">Delete</button>
  </td>
</tr>
Run Code Online (Sandbox Code Playgroud)

有什么我不知道的注意事项吗?