首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用可变和不变的属性理解角2中的“表达式在检查后发生了变化”

用可变和不变的属性理解角2中的“表达式在检查后发生了变化”
EN

Stack Overflow用户
提问于 2017-02-11 18:43:50
回答 2查看 66关注 0票数 0

我在角度2中遇到了Expression has changed after it was checked错误。

从我对错误意味着什么以及变化检测机制是如何工作的理解来看,角不喜欢同时发生的多个变化检测事件,而在ngOnInit中进行更改意味着在变化检测过程中发生了变化,这是一个大的不-不。我不理解的是为什么在ngOnInit中变异属性很好,但是创建该属性的新实例会导致错误。

示例代码:

代码语言:javascript
运行
复制
@Component({
    template: `<a-component [input]="list"></a-component>`
})
export class MyComponent implements OnInit {
    list = [];

    ngOnInit() {
        this.list.length = 0;
        this.list.push('x');
    }
}

这个很管用。这,并不是:

代码语言:javascript
运行
复制
@Component({
    template: `<my-component [input]="list"></my-component>`
})
export class MyComponent implements OnInit {
    list = [];

    ngOnInit() {
        this.list = ['x'];
    }
}

在本例中,在我看来,变异属性是一个更好的解决方案,因为替代方案将涉及手动重新触发更改检测。

一个解释,确切地说,改变检测器是做在这里将是非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-11 18:46:47

这是因为角度变化检测比较对象标识而忽略对象内容。

在第一个示例中,您向列表中添加了一个项,但是列表保持不变--角CD可以,因为它不关心数组的内容(也根本不识别数组中的更改)。

第二个例子返回一个不同的数组实例,它被Angulars识别,因此它抛出一个错误。

票数 0
EN

Stack Overflow用户

发布于 2017-02-11 19:00:59

我认为这是调试模式检查实现的局限性。角不创建数组/对象的副本,而是将值放置到映射中,因此在进行比较时,它会检查新的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42179781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档