Angular 2中OnChanges和DoCheck有什么区别?

时间:2016-07-28 07:32:23

标签: angular

他们之间的区别对我来说似乎很混乱。 它们之间有什么区别,确切地说它们被称为

4 个答案:

答案 0 :(得分:32)

  • OnChangesngDoCheck())在绑定到输入的值发生更改时被调用,因此您可以在输入更改时运行自定义代码。

  • DoCheck({{1}})在更改检测运行时被调用,因此您可以实施自定义更改检测操作。

答案 1 :(得分:22)

我正在玩这两个,发现了一些值得分享的有趣内容:

ngDoCheck()

每次调用一个Zone挂钩时都会调用它,

如何?

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将被调用。

所以这意味着角度只是检查模型或任何@inputs是否有变化。

哪个方便?

如果您的组件的ngDoCheck是OnPush,则

ChangeDetectionStrategy会变得很方便,这意味着如果任何@Inputs引用都已更改,它只会更新视图。

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

查看此plunker

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

所以这意味着,这个功能将被称为A LOT !!!所以要小心你把它放在里面。

简而言之:

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

ngOnChanges

只有在任何@Inputs绑定中有引用更改时才会调用此方法,而不管组件的ChangeDetectionStrategy是什么。

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

this.foods.push({value: 'steak-3', viewValue: 'Fish'});

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

this.foods = [{value: 'steak-3', viewValue: 'Fish'}];

它会被召唤。

答案 2 :(得分:19)

首先感谢上述答案。 我正在为我亲自面对的两个功能添加一个用例。

<script type="text/javascript"> @section Scripts { <text> $(window).resize(function () { if (parseInt($(window).width()) <= 800) { alert("Alert"); } }); </text> } </script> :检测按值传递的变量的变化

ngOnChanges() (OnChanges):检测由ngDoCheck() (DoCheck)引用传递的变量的更改,arrays未将其检测为旧值且新值具有相同的引用

答案 3 :(得分:0)

ngDoCheck在检查父组件时在子组件上调用。
ngOnChanges每当Angular检测到数据绑定输入属性发生更改时都会触发。
当输入属性是数组/对象时,ngOnChanges不会触发,因为Angular使用脏检查来比较属性。
当输入属性是客户类等数组/对象时,ngOnCheck会触发。