Задать вопрос

Как обновлять общие виджеты в Angular?

Предположим есть приложение написанное на компонентах (angular.component). Там к примеру несколько стэйтов, показывающих транзакции, категории и аккаунты, и есть сайдебар в котором висит общий виджет, отображающий состояние аккаунтов.

виджет это компонент, и берет данные из своего сервиса, который в свою очередь использует $http.

Так вот, при создании изменении или изменении транзакции, или аккаунта, инфо в этом виджете надо обновлять с сервера.

Конечно можно накопипастить 6 раз к каждому из требуемых запросов, обновление и виджета следом, в стиле:
TransactionService.update(this.transaction).then(() => SidebarService.refreshStats());

Но вдруг появятся еще виджеты? либо другие стэйты и условия для обновления, хочется найти какое нибудь более правильное решение.
Пробовал реализовывать это через $http интерсепторы, чтобы по каждому апдейту, на определнном URL, шло это обновление, но туда не удавалось заинжектить сервис этого виджета, так как получалась ошибка Circular dependency, $http провайдера.

Какие есть еще решения, для обновления данных, для каких то зависящих друг от друга компонента?
  • Вопрос задан
  • 237 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Какие есть еще решения, для обновления данных, для каких то зависящих друг от друга компонента?


Пожалуй наиболее удобный способ (но не сказать что самый простой, просто наиболее гибкий) это запретить компонентам получать стэйт самостоятельно и прокидывать его через биндинги снаружи. А снаружи получать стэйт через ресолверы роутера. Соответственно когда вы меняете стэйт в каком-то компоненте, вы просите это сделать сервис, а сервис уже как-то уведомляет систему о изменении стэйта и перезагружаются нужные ресолверы.

Таким образом состояние будет ходить по кругу, что сильно упрощает тестирование и проектирование приложения, компоненты становятся полностью независимыми и отвечают только за презентационную логику...
Ответ написан
Ваш ответ на вопрос

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

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