Используйте html с ванильным javascript вне контекста angular

#javascript #html #angular #performance #change-detector-ref

#javascript #HTML #angular #Производительность #change-detector-ref

Вопрос:

У меня есть приложение angular, которое содержит один очень простой компонент для редактора wysiwyg:

component.html

 <textarea [id]="editorId"></textarea>
  

component.ts

 editorId: string;
constructor() {
   this.editorId = Math.random().toString(36).substring(2, 15);
}
ngAfterViewInit(){
   // @ts-ignore
   editorLibrary.init(this.editorId);
}
  

Я использую библиотеку javascript, которую я упростил в этом примере до editorLibrary, которая является глобальной js-переменной, с помощью которой я могу делать такие вещи, как инициализация редактора. Мне нужен ts-ignore, потому что я не импортирую его только в этот компонент.

Все это отлично работает, за исключением того, что после того, как я инициализировал редактор, рендеринг внезапно становится чрезвычайно медленным. Когда я изменяю значение, другие компоненты повторно отображаются только через несколько секунд, когда изменение было мгновенным раньше.

Моя теория по этой причине заключается в том, что библиотека wysiwyg-editor генерирует второй html-элемент рядом с моей текстовой областью, который содержит множество подэлементов, и я думаю, что angular анализирует все это, когда происходит изменение, которое замедляет его.

Есть ли какой-либо способ указать angular полностью игнорировать элементы, созданные редактором? Поскольку это все vanilla-js, мне не нужно никаких изменений или замен переменных, и я думаю, что моя производительность увеличилась бы, если бы angular просто полностью игнорировал эти элементы. Я уже пробовал ChangeDetectorRef.detach() и zone.runOutsideAngular() и попытался добавить элемент с помощью ElementRef вместо того, чтобы иметь его непосредственно в моем html-файле. Рендеринг по-прежнему очень медленный.

Однако пользовательский интерфейс не отстает, но обновления из angular после изменения переменной просто занимают много времени. Есть ли какой-либо другой способ отладить причину этого? (возможно, расширенные уровни журнала, где я могу видеть, что angular делает в фоновом режиме) Или у кого-нибудь есть идея, как я могу сказать angular: «этот html — это чистый js, вам не нужно смотреть на него, анализировать его, изменять или даже знать, что он там»

Комментарии:

1. не могли бы вы создать stackblitz, пожалуйста? или ссылку на пример, который я был бы рад помочь. Я вижу, вы уже играли со свойствами обнаружения, но я бы посмотрел на стратегию OnPush.