首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OnChanges和DoCheck在角度2上有什么区别?

OnChanges和DoCheck在角度2上有什么区别?
EN

Stack Overflow用户
提问于 2016-07-28 07:32:22
回答 4查看 44.6K关注 0票数 61

他们之间的差异似乎让我很困惑。它们之间的区别是什么,以及它们何时被调用?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-28 07:34:18

  • 当绑定到输入的值发生更改时,调用ngOnChanges() (OnChanges),以便在输入更改时运行自定义代码。
  • 在运行更改检测时调用ngDoCheck() (DoCheck),以便实现自定义更改检测操作。
票数 69
EN

Stack Overflow用户

发布于 2016-12-29 13:41:03

我和这两个人一起玩,发现了一些有趣的东西,值得分享:

ngDoCheck()

每次一个区域钩子被呼叫时都会调用这个,

怎么做?

Angular2使用NgZone,正如@Gunter所说,猴子已经修补了浏览器中的所有异步事件,您可以这样想;

代码语言:javascript
运行
复制
var originalTimeout = window.setTimeout;
window.setTimeout = function(callback,time) {
    originalTimeout(callback,time);

    // notify Angular that a setTimeout is fired
    // e.g run ngDoCheck() for components
}

因此,每次运行setTimeout时,实际上都要调用上面的函数,这个函数是猴子修补原始setTimeout的。

免责声明:上面的代码是完全抽象的,在Zonejs中您不会找到它,但我只是想说明一下,当他们说"Zone修补了所有异步函数并在其中有钩子“时,这意味着什么;

总之,每次您运行setTimeout (或任何其他异步函数)时,当它完成时,将调用ngDoCheck

因此,它意味着角度,只是检查,看看是否有变化的模型或任何@输入。

什么时候方便?

如果您的组件的ngDoCheck是OnPush,那么它就变得方便了,这意味着只有当@Input引用被更改时,它才会更新视图。

在某些情况下,您希望使用OnPush,但希望对每次检查进行一些手动更新。

看看这个柱塞

您会发现,即使on-push-test组件的on-push-testOnPush,当我们单击突变食物并改变食物列表时,我将在ngDoCheck中运行markForCheck,并在虚拟if条件之后更新视图。

所以这意味着,这个函数会被调用很多!所以,小心你放进去的东西。--

因此,简而言之:

ngDoCheck:该函数每次在应用程序中触发可能导致更改的事件时都会被调用,但不一定被认为是更改。

ngOnChanges

只有当@输入绑定中存在引用更改时,才会调用它,而不管组件的ChangeDetectionStrategy是什么。

因此,如果我们像这样改变食物的排列:

代码语言:javascript
运行
复制
this.foods.push({value: 'steak-3', viewValue: 'Fish'});

ngOnChanges不会被调用,但是如果我们像这样更新引用:

代码语言:javascript
运行
复制
this.foods = [{value: 'steak-3', viewValue: 'Fish'}];

会有人打电话的。

票数 42
EN

Stack Overflow用户

发布于 2017-04-14 11:32:50

首先,库多给出了以上的答案。我正在为我个人面对的这两个功能添加一个用例。

ngOnChanges() (OnChanges):检测通过值传递的变量的更改

ngDoCheck() (DoCheck):检测通过引用传递的变量(如arrays )的更改,这些更改不是由ngOnChanges()检测到的,因为旧值和新值具有相同的引用

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

https://stackoverflow.com/questions/38629828

复制
相关文章

相似问题

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