Когда использовать Ngzone.run()? - программирование
Подтвердить что ты не робот

Когда использовать Ngzone.run()?

Я получил ошибку в своем угловом проекте, которая в конце концов была решена путем переноса моего кода в

this.zone.run(() => {/* my code here */});

как сказано в этом ответе.

Мое предыдущее понимание zone было то, что angular не может обнаружить изменения, сделанные асинхронным callbacks сторонних библиотек, потому что "они не находятся в angular zone". Если я щелкну на button, событие, которое вызывается, будет не собственным событием браузера click, а пользовательским (исправленным) событием click, созданным angular, чей handler выполняется в zone, так что angular знает о изменения, сделанные его обработчиком обратного вызова.

Но я не мог понять, запустив router.navigate() в обратном вызове третьей стороны, создать эту проблему (как указано этой проблемой github). Разве Router не является service самого угла? Почему он не сообщает автоматически angular zone при вызове третьей стороне callback?

Я получил эту проблему, используя router.navigate в редукторе состояний NGXS.

Мой вопрос:

Может кто-нибудь объяснить, когда именно мне нужно обернуть мой код в NgZone?

Отладка в течение нескольких часов и осознание того, что мой код находится вне контекста zone, утомительна.

4b9b3361

Ответ 1

Используете ли вы BrowserAnimationsModule?

У меня была такая же проблема с необходимостью переноса определенных перенаправлений маршрутизатора в zone.run(), и это может быть из-за этой открытой ошибки:

https://github.com/angular/angular/issues/20290

Ответ 2

ngZone.runOutsideAngular() - запускает код за пределами angular зоны.

  • Когда происходит какое-то событие, оно указывает угловое, чтобы обнаружить изменения.
  • Если вы используете событие mouseUp() или mouseDown(), то при каждом изменении указывается угловое значение для обнаружения изменений.
  • Если мы не хотим, чтобы эти изменения происходили во время выполнения под углом (что снижает производительность приложения), мы можем запустить его за пределами angular зоны.
  • В противоположность этому, если мы очень хотим получать все обновления, мы можем использовать ngZone.run(). Означает, что он запустит обнаружение изменений в обычном режиме.

Сам Angular использует ngZone под капотом, чтобы обнаружить изменения

Итак, если мы вышли из angular зоны, то для возвращения мы используем ngZone.run()

Ответ 3

ngZone.run() особенно полезен при модульном тестировании вашей маршрутизации.

it('should redirect if condition true, fakeAsync(() => {
  router.navigate(['']);
  fixture.ngZone.run(() => {
    component.redirectIfConditionTrue();
  });
  tick();
  expect(location.path()).toBe('/AgentLeadsManager');
}));
  • источник: это единственный раз, когда мне приходилось его использовать

Ответ 4

  Zone.js - это контекст выполнения для отслеживания и перехвата асинхронных операций. например: события DOM (click, keydown, keyup, etc), setTimeout, setInterval. XMLHttpRequest с

NgZone - это просто сервис-оболочка для API Zone.js.

Команда Angular решила, что им нужна абстракция для контекста выполнения при работе с Angular, поэтому они создали Zone.js и оболочку (неофициально - шаблон адаптера) вокруг нее в Angular.

Так что в основном при работе с любыми видами сторонних библиотек, которые не привязаны к контексту Angular Run в Zone.js (если только вы не решили, что вам не нужен контекст выполнения, и вы можете работать без, используя ngZone: 'noop' )

Источник