13

I have an Angular 2 Component with many children. Because of performance issues, I wanted to check how often the ChangeDetection checks my child-components. So I logged the ngAfterViewChecked-callback of one of my child-components.

I realized that my parent-component has a mousemove()-callback and so my childrens ngAfterViewChecked gets called every time I move my mouse over the parent. But I'm not updating any component variables in my mousemove()-callback. Why is the ChangeDetection running for the children then and how can I stop this?

I hope you understand the problem (if not please comment, so I can clarify things).

Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
ant45de
  • 832
  • 1
  • 7
  • 26

1 Answers1

12

The site peeskillet provided shows how to exclude eventlistener from ChangeDetection:

import { Component, NgZone } from '@angular/core';

@Component(...)
export class AppComponent {
...
  element: HTMLElement;

  constructor(private zone: NgZone) {}

  mouseDown(event) {
  ...
    this.element = event.target;

    this.zone.runOutsideAngular(() => {
      window.document.addEventListener('mousemove', this.mouseMove.bind(this));
    });
  }

  mouseMove(event) {
    event.preventDefault();
    this.element.setAttribute('x', event.clientX + this.clientX + 'px');
    this.element.setAttribute('y', event.clientX + this.clientY + 'px');
  }
}

For further information I can really recommend this article. Big THX to peeskillet!

ant45de
  • 832
  • 1
  • 7
  • 26
  • Thanks, I tried to put `zone.runOutsideAngular(..` inside the event handler. This helped me solve the problem at hand. – Arg0n Aug 08 '17 at 14:09
  • It depends on what you want to do inside your event listener. Not all use-cases need a separate zone. But glad it works for you. – ant45de Aug 09 '17 at 08:49