他们之间的区别对我来说似乎很混乱。 它们之间有什么区别,确切地说它们被称为
答案 0 :(得分:32)
OnChanges
(ngDoCheck()
)在绑定到输入的值发生更改时被调用,因此您可以在输入更改时运行自定义代码。
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-test
为OnPush
,当我们点击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
会触发。