javascript - Angular 6 : control data sharing inside application

标签 javascript angular

在我的 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/

相关文章:

angular - 如何在 Angular 中使用 recaptcha v3?

angular - 管道编号导致 karma 崩溃

javascript - 使用 jQuery 打印行

javascript - 使用 Express 保存 POST 请求的数据

javascript - 当类型为 'single' 时如何在 IonRangeSlider 中获取和获取值

javascript - 动态页面 anchor slider 故障

javascript - 展平 Angular2 中的可观察数组

javascript - Angular 2 - 如何使我的 index.html 文件标题和元标签的关键字和描述动态

Angular:如何在不更改路由的情况下更新 queryParams

javascript Array.splice() 不执行任何操作