如何在组件中使用可观察的主题变量?

时间:2018-02-03 05:34:31

标签: angular angular2-services

我的根组件中有提供程序的共享服务。我使用此服务来操纵父项以查看所选项目的数量。在父级上,此计数由锚点包围,因此用户可以选择所有项目。但是,我使用共享服务的变量来做到这一点,而我相信应该有一些方法,以便我可以调用observable来获取信息。我的服务代码是

import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
import { Promo } from './model';

@Injectable()
export class CheckoutEventService {
    private checkOutSucess = new Subject<boolean>();
    //private checkOutFailureMsg = new Subject<string>();
    private checkedOutPromo = new Subject<Promo>();
    //I could not find to remove this and use above property somehow.
    public bogusPromoObject :Promo;

    checkOutPromo$ = this.checkedOutPromo.asObservable();
    checkOutSucess$ = this.checkOutSucess.asObservable();

    checkOutPromoSvc(promo: Promo) {
        this.checkedOutPromo.next(promo);
        this.bogusPromoObject=promo;
    }
    checkOutPromoSucessSvc(msg: boolean) {
        this.checkOutSucess.next(msg);
    }
    }

我现在正在使用“bogusPromoObj”来呈现此行为。但是,我很想知道是否有办法重用observable来获取历史记录。就这么明确我已经订阅了父母的促销可观察性,但是下一步涉及路由,我想要获取所选项目的历史记录。

1 个答案:

答案 0 :(得分:1)

在这种情况下,通常会有一些checkOutPromo$可观察值和checkOutPromoValue值。

如果允许主题具有稍后将更改的初始值,则可以使用BehaviorSubject

private checkedOutPromo = new BehaviorSubject<Promo|null>(null);

其订阅者将同步收到当前值。如果它是首字母,则会收到null。由于此主题具有当前值,因此可以使用checkedOutPromo.value检索,这使得checkOutPromoValue不必要。该值不会通过asObservable提供,因此主题应该公开而不是checkOutPromo$。这就形成了封装问题;例如,checkOutPromo.unsubscribe()可供所有订阅者使用,但可能有害。

如果仅在视图中使用bogusPromoObject,则可以省略它,以支持async管道:

{{ checkoutEventService.checkOutPromo$ | async }}