Редактировать: это было исправлено. Я просто переместил свой код подписки в конструктор, и он работал как шарм.
Я попытался сделать мои компоненты подтверждения динамическими и создал что-то вроде этого. Мой МодалСервис:
@Injectable()
export class ModalService {
bsModalRef: BsModalRef;
constructor(private modalService: BsModalService) {}
openModalWithComponent(title:string, message:string) {
const initialState = {
message:message,
title:title,
closeBtnName: 'Close'
};
debugger;
this.bsModalRef = this.modalService.show(AlertComponent, {initialState});
this.modalService.onHide.subscribe(()=>{
console.log('the message is now: ', this.bsModalRef.content.message);
});
}
callback;
openConfirmComponent(title:string, message:string, callback) {
const initialState = {
message:message,
title:title,
result:false
};
debugger;
this.callback = callback;
this.bsModalRef = this.modalService.show(ConfirmComponent, {initialState});
var that = this;
this.modalService.onHide.subscribe(()=>{
console.log('calling callback from confirm');
callback(that.bsModalRef.content.result);
});
}
Код подтверждения:
import { Component } from '@angular/core';
import { BsModalService } from 'ngx-bootstrap/modal';
import { BsModalRef } from 'ngx-bootstrap/modal/bs-modal-ref.service';
export interface ConfirmModel {
title: string;
message: string;
}
@Component({
selector: 'confirm-component',
templateUrl: '../views/ConfirmComponent.html'
})
export class ConfirmComponent implements ConfirmModel {
title: string;
message: string;
result:boolean = false;
constructor(public bsModalRef: BsModalRef) {
}
confirm() {
// on click on confirm button we set dialog result as true,
// ten we can get dialog result from caller code
this.result = true;
this.bsModalRef.hide();
}
cancel() {
this.result = false;
this.bsModalRef.hide();
this.bsModalRef.content.ok = false;
}
}
Использование выглядит так:
this.dialogService.openConfirmComponent('Are you sure?', 'Would you like to save the selected shape?', function(result){
if(result){
console.log('emiting');
that.SaveShape.emit();
}
});
Теперь, когда я нажимаю кнопку «Сохранить» в моем компоненте, он вызывает компонент подтверждения, а если пользователь нажимает «Да», то он генерирует событие. Теперь эта строка:
this.modalService.onHide.subscribe(()=>{
console.log('calling callback from confirm');
callback(that.bsModalRef.content.result);
});
Он подписывается на событие onhide и, как только он скрывается, запускает обратный вызов. Проблема в том, что он подписан несколько раз. Я нажимаю первый раз, он срабатывает один раз. Я нажимаю второй раз, он срабатывает дважды. Как я могу остановить это? Я думаю, мне нужно как-то отписаться? Я знаю, что это должно быть довольно простой вещью, которую мне не хватает Помощь