@ksardi

Как вернуть значение в компонент после store.dispatch() (ngrx angular2)?

Есть компонента лайков, как в соц. сетях, которая принимает данные через @Input(), таких компонент более сотни поэтому держать все данные в store не вариант. У компоненты есть триггер кликов на добавления и удаление лайка текущего пользователя.
пробовал
this.store.dispatch(addAction)
и по результату обновить данные для ui(надо получить ид с сервера с результата еффекта)
но как получить в компоненте данные из результата action?
вот еффект
public likeChangeAdd: Observable = this.actions
.ofType(ActionTypes.LIKE_CHANGE_ADD)
.map(toPayload)
.switchMap(payload => {
return this.authHttp.post(`${environment.backUrl}/api/likes`, payload)
.map((res) => {
return new LikesChangeSuccessAction({result: res.json()});
})
.catch((error) => {
return Observable.of(new LikesChangeErrorAction({error: error}));
})
});

вот компонента
данные в виде // this.data = [{id:1, user_id:2},{...}]
public trigger(): void {
if (!this.isLiked()) {
this.store.dispatch(LikeAddAction({topic: this.id, user: this.userId}));
// в респонсе с сервера ид которую надо вставить в массив с данными
this.data.push({id: res.id, user_id: this.userId}); // тут мне надо вытянуть респонс
});
} else // dispatch for remove
};
  • Вопрос задан
  • 576 просмотров
Пригласить эксперта
Ответы на вопрос 1
alexiusp
@alexiusp
senior frontend developer
Ну, во-первых, а почему, собственно, хранить всё в store - не вариант? Где-то это хранить всё равно придётся. Я бы хранил в store.

Но если всё же хочется посложнее, то можно сделать под это событие свой Subject (из rx.js). Те компоненты, которым нужно знать об этом событии подписываются на этот Subject, а сервис, которые получает данные вызывает Subject.next с данными о лайке. Отличие Subject от Observable в том, что у Subject может быть сколько угодно подписчиков и все они узнают о событии. Похоже, именно это вам нужно? Единственное, что меня тут смущает - не будет ли такое решение ещё более ресурсоёмким, чем хранение всех данных в store.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы