Ячейка AgGrid иногда запускается за пределами зоны - PullRequest
1 голос
/ 04 марта 2020

Issue

Мы используем Angular компонент ячейки, который содержит кнопку. Я заметил, что иногда (примерно 1 из 10 раз) событие кнопки обрабатывается за пределами зоны, что приводит к проблемам.

Что я обнаружил до сих пор

agInit иногда работает за пределами зоны. Я выяснил это с помощью следующего фрагмента:

agInit(params: RendererParams): void {
  const inZone = NgZone.isInAngularZone();
  console.log("AgInit in Zone?: " + inZone);
}

Если agInit не находится в зоне angular, обратный вызов кнопки также не находится в этой зоне.

Я также заметил, что стек вызовов немного отличается в случае, когда agInit работает внутри нашей вне зоны:

enter image description here

Вот ссылка на полный diff обоих трассировок стека : https://www.diffchecker.com/e54rZEsC

Я также заметил, что в случае ошибки стек вызовов начинается с Utils.debounce в agGrid.

Для дальнейшего изучения проблемы, я разветвил ngzone (см. фрагмент ниже). Ошибки не были зарегистрированы.

ngDoBootstrap(applicationRef: ApplicationRef) {
  const debugSpec: ZoneSpec = {
    name: "debugSpec",
    onHandleError: (parentZoneDelegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, error: any) => {
      console.log(error);
      return true;
    }
  };

  Zone.current.fork(debugSpec).run(() => {
    applicationRef.bootstrap(AppComponent);
  });
}

Обходной путь

Я всегда могу вручную выполнить обратный вызов в пределах зоны. Это работает.

1 Ответ

0 голосов
/ 04 марта 2020

Я нашел проблему. Поскольку воспроизвести сложно, я не уверен на 100%. Я думаю, что это ошибка AgGrid.

Почему?

  1. Я заметил, что если он находится вне зоны, он вызывается Utils.debounce
  2. Тогда я проверяю, где ag grid это называет. Примерно в 6 местах. Один из них был в обратном вызове ResizeObserver
  3. Angular Обезьяны зоны патчей setTimeout, но не ResizeObserver
  4. Я мог переключаться между ResizeObserver и polyfill, который полагается на setTimeout, используя suppressBrowserResizeObserver в gridSettings
  5. Я написал автоматизацию для обновления sh браузера в бесконечном l oop и остановки при возникновении ошибки
  6. Я всегда мог с макс. 10 refre sh воспроизвести ошибку с ResizeObserver включен
  7. Я никогда не смогу воспроизвести ошибку, используя polyfill

Открою проблему на github.

Как я исправил проблему

Я добавил следующий импорт:

import 'zone.js/dist/zone-patch-resize-observer';
...