#angular #reactjs #modal-dialog #angular-material
#angular #reactjs #modal-dialog #angular-материал
Вопрос:
Для приложения, которое я переписываю из AngularJS, у меня есть последовательность действий:
1) I got to the server to get a message
2) I display the returned message in a generic dialog, with a Yes and No button.
3-Yes) I go to the server to do something, proceed to 4
3-No) I terminate the sequence
4) Notfiy the user that the operation is complete.
У меня возникли проблемы с переводом этого в систему Angular / React Observable
, хауэр. Я хочу сделать что-то вроде этого:
// Actual arguments are immaterial in this case...
this.webDataService.get('/api/GetEndUserMessage', args)
.pipe(
map((message: string) => {
const config = new MatDialogConfig();
config.data = {
'title': 'Important',
'message': message
};
const dialog = this.matDialog.open(GenericDialogComponent, config);
// If Yes/Ok is clicked, return 'Ok'
// If No/Cancel is clicked, return 'Cancel'
return dialog.afterClosed();
}),
// PROBLEM AREA! ----------------------------------------------
filter((dialogResult: string) => {
if (dialogResult === 'Ok')
return this.webDataService.post('/api/DoSomethingAwesome');
}),
filter((dialogResult: string) => {
if (dialogResult !== 'Ok')
return 'Cancelled'
})
// PROBLEM AREA! ----------------------------------------------
)
.subscribe((result: any) => {
if (result === 'Cancelled')
return;
// Let the user know that the sequence is over. How doesn't matter.
});
Проблема в том, что, по-видимому, это не компилируется.
Мое понимание системы React operator в лучшем случае шаткое, и я не уверен, как вызвать наблюдаемое, созданное в результате MatDialogRef.afterClosed()
вызова.
Вопрос:
Каким образом я могу использовать результаты MatDialogRef.afterClosed()
вызова в Observable .pipe
последовательности?
Ответ №1:
Используйте a switchMap
, когда вам нужно изменить наблюдаемые потоки. map()
Оператор просто заставит наблюдаемое выдать возвращаемое значение.
this.webDataService.get('/api/GetEndUserMessage', args)
.pipe(
switchMap((message: string) => {
//...
const dialog = this.matDialog.open(GenericDialogComponent, config);
return dialog.afterClosed();
}),
switchMap((dialogResult: string) => {
return (dialogResult === 'Ok')
? this.webDataService.post('/api/DoSomethingAwesome')
: of('Cancelled')
})
).subscribe((result: any) => { ... });
https://www.learnrxjs.io/operators/transformation/switchmap.html
Комментарии:
1. Не оставит ли это потенциально открытым несколько диалоговых окон, если будут выданы новые значения? Я подумал, что смысл использования switchMap в том, что первый поток должен быть отменен, если выдается новое значение.
2. @JW. Все
HttpClient
методы будут выдавать значение только один раз. То, что вы говорите, верно, но в этом примере наблюдаемое выше по потоку выдает только одно значение.