Показать сообщение отдельно
  #1 (permalink)  
Старый 27.08.2018, 13:03
Интересующийся
Отправить личное сообщение для kotelok Посмотреть профиль Найти все сообщения от kotelok
 
Регистрация: 27.08.2018
Сообщений: 22

Закрытие окна ngx-bootstrap.
Подскажите, пожалуйста, по некоторым моментам реализации.

Есть простая модальная форма на базе 'ngx-bootstrap'.
export class AboutComponent implements OnInit {

  public result: Subject<any> = new Subject<any>();
  
  constructor(private activeModal: BsModalRef) {
  }

  ngOnInit() {
    this.result.subscribe(() => this.activeModal.hide());
  }
  
  //Вызывается по кнопке "Отмена" и про крестику в окне.
  cancelDialog() {
    this.result.next(null);
  }

  //Вызывает по кнопке "ОК".
  confirmDialog() {
    this.result.next("some data");
  }
}


И есть её вызов:
showAbout() {
    this.modalService.show(AboutComponent).content.result.subscribe((value) => {
      console.info(value);
    });    
  }


В целом, работает как и ожидается, но есть непонимание некоторых моментов:
1. Нужно ли отписываться от событий 'result' в обоих местах? Или, вероятно, нужно использовать другой тип объекта или другой тип подписки, при условии, что ожидается ровно одно событие и любая другая логика считается ошибочной.
2. Если отписываться не нужно, то вопрос закрыт. Если нужно, то п.3.
3. Как в рамках конкретного окна гарантировать вызов 'this.result.next(null)' не только по факту явного нажатия "отмены", но и когда 'bootstrap' сам закрывает окно? Например, если пользователь жмёт 'escape' или кликает мимо окна. Эти события можно заблокировать, но подписаться на них нельзя. Использовать 'BsModalService.onHide' не получается, т.к. в рамках этого события нет информации об источнике, его сгенерировавшем и состоянии 'result' соответствующего компонента. Использовать 'ngOnDestroy' самого компонента тоже неудобно, т.к. приходится реализовывать логику для определения каким именно путём мы попали в это событие для определения нужно ли устанавливать значение 'result' (или оно уже было установлено ранее).
Ответить с цитированием