Как я могу передавать и получать данные в / из модальности ngx-bootstrap?
Передача данных в модальный режим может быть выполнена с использованием initialState, но как я могу получить данные обратно? Например, если я хочу создать диалоговое окно подтверждения?
1 ответ
Хотя в настоящее время нет встроенного способа сделать это, это можно сделать, связавшись с событиями onHide/onHidden.
Идея состоит в том, чтобы создать Observer, который будет подписываться на событие onHidden и запускать next()
когда он получает данные от него.
Я использую onHidden вместо onHide, поэтому все CSS-анимации выполняются до возвращения результата.
Также я реализовал это в MessageService
сохранить лучшее разделение кода.
@Injectable()
export class MessageService {
bsModalRef: BsModalRef;
constructor(
private bsModalService: BsModalService,
) { }
confirm(title: string, message: string, options: string[]): Observable<string> {
const initialState = {
title: title,
message: message,
options: options,
};
this.bsModalRef = this.bsModalService.show(ConfirmDialogComponent, { initialState });
return new Observable<string>(this.getConfirmSubscriber());
}
private getConfirmSubscriber() {
return (observer) => {
const subscription = this.bsModalService.onHidden.subscribe((reason: string) => {
observer.next(this.bsModalRef.content.answer);
observer.complete();
});
return {
unsubscribe() {
subscription.unsubscribe();
}
};
}
}
}
ConfirmDialogComponent выглядит следующим образом:
export class ConfirmDialogComponent {
title: string;
message: string;
options: string[];
answer: string = "";
constructor(
public bsModalRef: BsModalRef,
) { }
respond(answer: string) {
this.answer = answer;
this.bsModalRef.hide();
}
}
После того, как реализовано, использовать его очень просто:
confirm() {
this.messageService
.confirm(
"Confirmation dialog box",
"Are you sure you want to proceed?",
["Yes", "No"])
.subscribe((answer) => {
this.answers.push(answer);
});
}
Вы можете получить полный код и увидеть его в этой демонстрации.