我在角度2中遇到了Expression has changed after it was checked
错误。
从我对错误意味着什么以及变化检测机制是如何工作的理解来看,角不喜欢同时发生的多个变化检测事件,而在ngOnInit
中进行更改意味着在变化检测过程中发生了变化,这是一个大的不-不。我不理解的是为什么在ngOnInit
中变异属性很好,但是创建该属性的新实例会导致错误。
示例代码:
@Component({
template: `<a-component [input]="list"></a-component>`
})
export class MyComponent implements OnInit {
list = [];
ngOnInit() {
this.list.length = 0;
this.list.push('x');
}
}
这个很管用。这,并不是:
@Component({
template: `<my-component [input]="list"></my-component>`
})
export class MyComponent implements OnInit {
list = [];
ngOnInit() {
this.list = ['x'];
}
}
在本例中,在我看来,变异属性是一个更好的解决方案,因为替代方案将涉及手动重新触发更改检测。
一个解释,确切地说,改变检测器是做在这里将是非常感谢!
发布于 2017-02-11 18:46:47
这是因为角度变化检测比较对象标识而忽略对象内容。
在第一个示例中,您向列表中添加了一个项,但是列表保持不变--角CD可以,因为它不关心数组的内容(也根本不识别数组中的更改)。
第二个例子返回一个不同的数组实例,它被Angulars识别,因此它抛出一个错误。
发布于 2017-02-11 19:00:59
我认为这是调试模式检查实现的局限性。角不创建数组/对象的副本,而是将值放置到映射中,因此在进行比较时,它会检查新的值。
https://stackoverflow.com/questions/42179781
复制相似问题