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

时间:2017-11-02 15:45:54

标签: angular typescript

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

  

检查后表情发生了变化。上一个值:' [对象   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>

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

4 个答案:

答案 0 :(得分:16)

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

您可以像

一样修复它
someMethod() {
  this.bindedAuthorsKeys = this.bindedAuthors.keys();
}
*ngFor="let author of bindedAuthorsKeys"

答案 1 :(得分:2)

this.keysOfObject = Object.keys(---)   <---put your object or array inside.

    Now,
    <tr *ngFor="let author of keysOfObject">
    '
    '
    '
    </tr>

答案 2 :(得分:1)

我尝试了上述解决方案,但只有以下解决方案对我有用。

希望有帮助:

get getBindedAuthors(){
  return Array.from(bindedAuthors.keys());
}
<tr *ngFor="let author of getBindedAuthors">
  <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>

答案 3 :(得分:0)

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

<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>

我没有意识到任何警告吗?