@link_irk

Как получить данные из сервиса в дочернем компоненте после изменения родителем?

Здравствуйте.
Прошу прощения за несколько спутанное описание и терминологию, пока не до конца понимаю специфику разработки на Angular 2.
Имею следующую иерархию компонентов:
MemberComponent -> DesktopComponent (router-outlet) -> PaymentHistoryComponent
Сервис: AccountService.
export class AccountService {
    public accountSource = new Subject();
    public account: Observable<any> = this.accountSource.asObservable();

    public getAccount() {
        return this.account;
    }

    public setAccount(account) {
        this.accountSource.next(account);
    }
...

В комоненте MemberComponent имеется drop-down-list со списком лицевых счетов, который при изменении вызывает метод
public changeAccount() {
    this.accountService.setAccount(this.account);
}

PaymentHistoryComponent:
export class PaymentHistoryComponent implements OnInit {
    public history;

    public constructor(
        public paymentService: PaymentSercice,
        public accountService: AccountService,
        public router: Router
    ) {

    }
    
    public ngOnInit() {
        this.accountService.getAccount().subscribe((account) => {
            this.paymentService.getHistory(account.value).then(history => this.history = history);
        });
    }
}


При загрузке приложения, MemberComponent выбирает первый из списка лицевой счёт и вызывает метод changeAccount. Таким образом вызывается метод AccountService::setAccount

На следующем этапе загрузки приложения подключается PaymentHistoryComponent и подписывается на Observable из сервиса AccountService, значение в которое уже было установлено ранее. Таким образом, не вызывается callback
this.accountService.getAccount().subscribe(...)

Но если уже теперь выбрать какой-то другой лицевой из списка, то сценарий отрабатывает корректно.
Как при инициализации компонента PaymentHistoryComponent получить значение уже имеющееся в AccountService.account
  • Вопрос задан
  • 331 просмотр
Решения вопроса 1
AMar4enko
@AMar4enko
А это вопрос к RxJS, а не к Angular. Самый простой способ решить ваш вопрос это замените Subject на BehaviourSubject. Ему при конструировании нужно будет начальное значение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы