Закрыть все открытые динамические диалоги при выходе из системы

Я использую динамический диалог Primeng для отображения некоторых данных в компоненте. Однако, если диалог открыт и время сеанса истекает, приложение выходит из системы, но диалоговое окно остается открытым. Я хочу закрыть диалоговое окно, так как приложение вышло из системы. Я попытался вызвать метод DynamicDialogRef close(), но это не работает. Как я могу это сделать?

Это то, что я вызываю внутри метода выхода -

 constructor private dialogRef: DynamicDialogRef) { }

 signOut()
        {
        this.dialogRef.close();
        this.dialogRef.destroy();
  }

Вот как я вызываю диалог- Шаблон

   <button (click) = "showDialog()"></button>

Метод называется:

showDialog() {
   
    const ref = this.dialogService.open(DetailsDialogComponent, {

      data: {
        value: 'TEST,
      },
      header: 'Details Panel",
      width: '70%',
      dismissableMask: true
    });

    
      }

Можете ли вы опубликовать шаблон HTML, который вы используете для отображения диалогового окна Primeng?

Angela Amarapala 23.03.2022 07:52

вы можете создать в stackblitz.com для проблемы?

rajhim 23.03.2022 07:53

@AngelaAmarapala Я добавил больше деталей.

piqueblinders 23.03.2022 08:48
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
3
67
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Диалог primeng имеет свойство двусторонней привязки [(visible)], которое позволяет вам установить для него логическое значение. По умолчанию значение равно false. Таким образом, один и тот же флаг false можно использовать для закрытия всех ваших активных диалогов, когда вы выполняете какое-либо действие (в вашем случае это выход из системы).

В своем HTML-шаблоне выполните следующие действия:

<p-dialog [(visible)] = "openDialog1">
...
</p-dialog>
<p-dialog [(visible)] = "openDialog2">
...
</p-dialog>

И в вашем файле ts

signOut() {
    this.openDialog1 = false;
    this.openDialog2 = false; // set for all the dialogs that you want to close
}

Обновлено:

Если вы не используете p-dialog, попробуйте добавить [DialogService] в раздел providers вашего компонента следующим образом:

providers: [DialogService]

Закрытие динамического диалога с данными:

signOut() {
   this.dialogRef.close(data); // pass your data 
}

Затем используйте событие onClose, чтобы поймать его. Надеюсь это поможет!

Я не использую p-dialog, так как хочу показать динамический контент в своем диалоге. Следовательно, я использую службу диалога, чтобы открыть свой компонент.

piqueblinders 23.03.2022 08:49

@piqueblinders вы добавили [DialogService] в раздел providers вашего компонента? Пожалуйста, обратитесь к обновленному ответу для получения дополнительной информации.

Angela Amarapala 23.03.2022 09:13

Да, я добавил его в раздел поставщика моего компонента.

piqueblinders 23.03.2022 09:17

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

Angela Amarapala 23.03.2022 09:19

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

piqueblinders 23.03.2022 09:52

Создать собственный сервис для закачки;

import { DynamicDialogRef, DialogService } from 'primeng/dynamicdialog';
import { Injectable } from '@angular/core';


@Injectable({
  providedIn: 'root'
})
export class DialogDynamicService {
  ref: DynamicDialogRef;
  constructor(private service: DialogService) {
  }

  open(ref, data){
     this.ref =  this.service.open(ref, {})
  }

  destroy(){
   if (this.ref){
      this.ref.destroy();
   }
  }
}

вызовите свой Компонент в сервис,

constructor(private dialogService: DialogDynamicService){}
    
  getDialog(){
        this.dialogService.open(DialogComponent,{});
    }

Выход из сеанса

constructor(public dialogService: DialogDynamicService) {}
signOut(){
 this.dialogService.destroy();
}

Не забудьте поставить DialogService в app Module или root Module

Надеюсь, этот решит вашу проблему. если не комментарий вниз.! благодарю вас

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

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

 this.dialogService.dialogComponentRefMap.forEach(dialog => {
      dialog.destroy();
    });

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