Модальное окно в Angular 6, открытое плагином jQuery, закрывается только после двух кликов

У меня есть JSTree (плагин jQuery), встроенный в мое приложение Angular. Плагин JSTree предоставляет контекстное меню для элементов дерева, которое я затем использую для вызова функций моего класса компонента Angular (например, нажатие «Предварительный просмотр документа» в контекстном меню вызывает функцию previewDocument (x) класса компонента).

Вот код, который я использую для этого:

$(this.dataTree.nativeElement).jstree({
  contextmenu: {
    items: {
      preview: {
        action: (node: any) => {
          this.previewDocument(node.data.id);
        }
      }
    }
  },
  ..........
});

Функция предварительного просмотра документа вызывает службу уведомлений, которая открывает MatDialog для отображения запрошенного документа.

Теперь проблема: когда я нажимаю кнопку закрытия модального окна, ничего не происходит. Но когда после этого я нажимаю за пределами модального окна, оно закрывается. То же самое, сначала щелкнув за пределами модального окна, после этого мне нужно щелкнуть где-нибудь внутри модального окна, чтобы окончательно закрыть его.

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

Как принудительно обновить DOM после закрытия модального окна?

PS: я использую MatDialogRef.close(); чтобы закрыть модальное окно.

Вот почему вы не устанавливаете jQuery в приложение Angular, иначе вас выкинут из моей команды.

Adrian Brand 08.04.2019 00:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку команда вызывается из плагина jQuery, она, вероятно, выполняется за пределами Angular зона и, следовательно, не вызывает обнаружение изменений. Вы можете заставить код выполняться в зоне Angular, заключив его в обратный вызов NgZone.run():

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

constructor(private ngZone: NgZone) { }
$(this.dataTree.nativeElement).jstree({
  contextmenu: {
    items: {
      preview: {
        action: (node: any) => {
          this.ngZone.run(() => {                // <-- Runs the code in Angular zone
            this.previewDocument(node.data.id);
          }); 
        }
      }
    }
  },
  ..........
});

Этот стекблиц имитирует проблему jQuery, открывая диалоговое окно вне зоны Angular. Другая команда открывает диалоговое окно в зоне, чтобы вы могли увидеть другое поведение.

@Max - У вас была возможность попробовать это решение?

ConnorsFan 09.04.2019 22:28

Извините за поздний ответ, сработало как шарм! Спасибо :)

Max 05.05.2019 22:44

Другие вопросы по теме