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



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

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

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

在您的服务中,您可以将companySubject定义为ReplaySubject,而不是Subject。缓冲区大小可以设置为1,这样它只"重放"最后发出的值。

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

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

有关各种Subject类的详细信息,请参阅此答案。

最新更新