他们之间的差异似乎让我很困惑。它们之间的区别是什么,以及它们何时被调用?
发布于 2016-07-28 07:34:18
ngOnChanges() (OnChanges),以便在输入更改时运行自定义代码。ngDoCheck() (DoCheck),以便实现自定义更改检测操作。发布于 2016-12-29 13:41:03
我和这两个人一起玩,发现了一些有趣的东西,值得分享:
ngDoCheck()
每次一个区域钩子被呼叫时都会调用这个,
怎么做?
Angular2使用NgZone,正如@Gunter所说,猴子已经修补了浏览器中的所有异步事件,您可以这样想;
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-test是OnPush,当我们单击突变食物并改变食物列表时,我将在ngDoCheck中运行markForCheck,并在虚拟if条件之后更新视图。
所以这意味着,这个函数会被调用很多!所以,小心你放进去的东西。--
因此,简而言之:
ngDoCheck:该函数每次在应用程序中触发可能导致更改的事件时都会被调用,但不一定被认为是更改。
ngOnChanges
只有当@输入绑定中存在引用更改时,才会调用它,而不管组件的ChangeDetectionStrategy是什么。
因此,如果我们像这样改变食物的排列:
this.foods.push({value: 'steak-3', viewValue: 'Fish'});ngOnChanges不会被调用,但是如果我们像这样更新引用:
this.foods = [{value: 'steak-3', viewValue: 'Fish'}];会有人打电话的。
发布于 2017-04-14 11:32:50
首先,库多给出了以上的答案。我正在为我个人面对的这两个功能添加一个用例。
ngOnChanges() (OnChanges):检测通过值传递的变量的更改
ngDoCheck() (DoCheck):检测通过引用传递的变量(如arrays )的更改,这些更改不是由ngOnChanges()检测到的,因为旧值和新值具有相同的引用
https://stackoverflow.com/questions/38629828
复制相似问题