我在尝试(click)
在 Angular 2 中的事件回调函数中执行一些逻辑而不触发更改检测时遇到了很大的麻烦。
为什么我不想触发变更检测
回调函数执行简单的动画滚动到顶部。它不会影响其他组件,因此我不需要在每个组件中触发更改检测,事实上我真的不希望它触发!因为更改检测确实会在每个组件中触发,所以动画在移动设备上的性能非常差。
我试过的
我知道我可以使用在区域外运行代码
this._zone.runOutsideAngular(() => {
someFunction();
})
当您想在区域外运行的代码没有被click
, keyup
,keydown
事件等调用时,这很有效。
因为我的组件看起来像......
<button (click)="doThing()">Do that thing outside the zone!</button>
doThing() {
this._zone.runOutsideAngular(() => {
myFunction();
})
}
...myFunction
将在区域外运行,但该click
事件将触发更改检测。
我已经OnPush
在尽可能多的组件中实施了变更检测策略。
此处未触发更改检测很重要,但我找不到阻止它的方法。
编辑
请参阅此plnk ,并将所有组件中的更改检测设置为OnPush
。单击子行组件按钮会触发子行、行和应用程序组件中的 CD。