Angular6:控制应用程序内部的数据共享

时间:2018-07-11 13:33:53

标签: javascript angular

在Angular应用程序中,我在每个组件中都有订阅,用于监视用户的Company是否发生了更改。在应用程序初始化上,我下载了用户的Company,因此在我要订阅公司状态变化的每个组件中都会触发一次订阅(这是必要的,因为我在大多数组件中都使用了Company数据) 。我的组件之一订阅了Company,并且在初始化时就下载了一次数据。当我更改视图时,不再触发订阅,因此我需要下载数据。代码看起来像

    this.subscription = this
    .companyService
    .CompanyState
    .subscribe((company: Company) => {
        this.getSomeData()
    })
    this.getSomeData()

我尝试添加一些标志,例如needDownload,其默认值为true,如果订阅触发this.getSomeData(),则将其设置为false,但它是异步的,效果不佳。 如果我从该组件中删除订阅,则将停止观看Company状态的更改。如果我从此代码的末尾删除this.getSomeData(),那么如果在没有默认的订阅调用的情况下启动组件,则不会获得数据。 问题是我下载了两次数据,并且我觉得可以一次下载。

1 个答案:

答案 0 :(得分:2)

在您的服务中,您可以将companySubject定义为ReplaySubject而不是Subject。缓冲区大小可以设置为1,以便仅“重播”最后发出的值。

private companySubject = new ReplaySubject<Company>(1);

如果CompanyState已经发出一个值,则新视图将在订阅可观察对象时立即得到通知。因此,您可以在组件初始化代码中删除对getSomeData()的直接调用。

有关各种Subject类的详细信息,请参见this answer