在我的 Angular 应用程序中,我在每个组件中都有订阅,以观察用户的 Company
是否发生变化。在应用程序初始化时,我下载了用户的 Company
,因此在我订阅的每个组件中都会触发一次订阅,以了解公司状态的变化(这是必要的,因为我正在使用此 Company
其中大部分的数据)。我的一个组件订阅了 Company
,它会在初始化时下载一次数据。当我更改 View 时,不再触发订阅,因此我需要下载数据。代码看起来像
this.subscription = this
.companyService
.CompanyState
.subscribe((company: Company) => {
this.getSomeData()
})
this.getSomeData()
我已经尝试添加一些标志,如 needDownload
,默认值为 true,如果订阅触发 this.getSomeData()
,则将其设置为 false,但它是异步的,不会工作得很好。
如果我从此组件中删除订阅,我将停止监视 Company
状态的变化。如果我从这段代码的末尾删除 this.getSomeData()
,如果组件是在没有默认调用订阅的情况下启动的,我将不会获取数据。
问题是我是下载了两次数据,感觉一次就可以了。
最佳答案
在您的服务中,您可以将 companySubject
定义为 ReplaySubject
而不是 Subject
。缓冲区大小可以设置为 1,以便它仅“重播”最后发出的值。
private companySubject = new ReplaySubject<Company>(1);
如果 CompanyState
已经发射了一个值,新 View 将在订阅可观察对象后立即收到通知。因此,您可以在组件初始化代码中删除对 getSomeData()
的直接调用。
参见 this answer有关各种 Subject
类的详细信息。
关于javascript - Angular 6 : control data sharing inside application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51286847/