#angular #rxjs
#angular #rxjs
Вопрос:
У меня есть приложение angular, и в одном из компонентов я получаю уведомления пользователя (электронные письма) через сервис. служба возвращает массив объектов, и в каждом объекте содержится информация об электронном письме, такая как тема, идентификатор пользователя отправителя и т.д. структура массива объекта электронной почты выглядит следующим образом:
[{
UserId:"...",
Notification:{
Subject:null,
Body:"<div>...</div>",
.
.
.
},
.
.
.
},
.
.
.]
некоторые электронные письма не имеют темы, а значение Subject
свойства находится null
в объекте. Я хочу установить значение для электронных писем с Subject:null
помощью .
this.notifService.getAllNotificationsForCurrentUser(userId)
.pipe(
map(emails => {
emails.map(email=>{
if(email.Notification.Subject === null){
email.Notification.Subject = "(No Subject)";
}
})
}
)
.subscribe(
result=> this.messages = result
);
Я использовал map
operator, и он не работает. и в нем есть некоторые ошибки:
Cannot read property 'Notification' of undefined
как я могу это исправить?
Комментарии:
1. привет, не могли бы вы рассказать подробнее еще раз? в чем конкретно заключается ваша проблема?
2. Если вы что-то пробовали, и это не сработало, тогда опубликуйте то, что вы пробовали, точно расскажите, что вы ожидали, и что произошло вместо этого.
3. Я обновил свой вопрос.
Ответ №1:
Используйте оператор сопоставления rxjs с Array.prototype.map().
-
Первый
map
позволяет изменять массив электронных писем, как если бы они текли по потоку. Он отображает элементы потока, каждый элемент представляет собой массив электронных писем. -
Второй
map
изменяет массив электронных писем, чтобы установить пустыеsubject
поляno subject
. Он отображает массив электронных писем, каждый элемент является электронной почтой.
import { map } from 'rxjs/operators';
this.notifService.getAllNotificationsForCurrentUser(userId).pipe(
map(emails => {
return emails.map(email => ({
...email,
Notification: {
...Notification,
Subject: email.subject ? email.subject : 'no subject'
}
}));
})
).subscribe(
result=> this.messages = result
);
Комментарии:
1. @Nastaran Heydari, вы должны вернуть результат из внутренней карты, в моем примере я использую неявный возврат. Также ваша внутренняя карта ничего не возвращает, в этом случае используйте forEach
Ответ №2:
Если это только для целей отображения, вы должны просто сделать
{{email.Notification.Subject || '(No Subject)'}}
Если нет, перейдите к отображению массива.