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

Да, спасибо, вроде получилось, все сценарии обрабатываются для любого уровня вложенности.

Радует, что сам компонент диалога удалось избавить от всех зависимостей по управлению диалогами и необходимости явно вызывать 'hide'.

Вызывает некоторые сомнения, что при закрытии окна самим бутстрапом, будет происходить явный вызов 'hide' для уже закрытого окна - блок 'reason != null' отрабатывает если бутстрап сам закрыл окно, там происходит установка значения 'result', что провоцирует отработку события с закрытием окна в подписке в методе 'show'.

Можно ли как-то отписать именно текущего наблюдателя, чтобы подписка внешнего компонента на 'result' сработала, а локальная нет? Или как-то проверить, что окно уже закрыто?

Сервис, контролирующий открытие/закрытие окон:
@Injectable()
export class ModalWrapService {

    private activeModals: BsModalRef[] = [];

    constructor(public modalService: BsModalService) {

        this.modalService.onHide.subscribe(reason => {
            
            if (reason != null) {
                this.activeModals[this.activeModals.length - 1].content.result.next(null);
            }

            this.activeModals.splice(this.activeModals.length - 1, 1);
        });
    }

    show(content: string | TemplateRef<any> | any): BsModalRef {
        var modalRef = this.modalService.show(content);

        this.activeModals.push(modalRef);

        modalRef.content.result.pipe(take(1)).subscribe(() => {
            modalRef.hide();
        });

        return modalRef;
    }
}

Компонент:
export class AboutComponent {

  public result: Subject<string> = new Subject();

  cancelDialog() {
    this.result.next(null);
  }

  confirmDialog() {
    this.result.next("some user data");
  }
}

Вызов окна:
showAbout() {
  //Согласно документации, должен самоотписаться после первого события.
  this.modalWrapService.show(AboutComponent).content.result.pipe(take(1)).subscribe((value) => {
    console.info(value);
  });    
}
Ответить с цитированием