Angular 跨服务通信

2024-02-02

我有一个统计应用程序。在我的页面左侧有主题列表,顶部有组列表。主要部分包含与主题和组相关的统计项目。

我还有几个服务为我的应用程序提供业务逻辑。为了简单起见,我们来谈谈其中的三个:主题服务、群组服务 and 统计服务.

最终用户可以操作主题和组列表(添加或删除项目),并且我必须在每次更改后重新计算统计信息。在此应用程序中我使用Subjects and 订阅 from rx.js跟踪此类变化。

所以,在我的组件中我可以写这样的东西:

for 组组件

 removeGroup() {
        this.groupService.removeGroup(this.group);
        this.statisticsService.updateStatistics();
      }

for 主题组件

removeTheme() {
    this.themeService.removeTheme(this.theme);
    this.statisticsService.updateStatistics();
  }

但从逻辑上讲,这些组件不必了解统计数据。当然我可以移动依赖统计服务 into 主题服务 and 集团服务,但随后我将不得不打电话统计服务.updateStatistics()在每一种改变主题或组集合的方法中。这就是为什么我想通过订阅来实现直接的跨服务通信。

最后是我的问题:

  1. 这是个好主意吗?

  2. 如果可以的话,最好的实施方式是什么? 当我使用订阅在组件中,我将其注册在ngOnInit()方法并取消订阅ngOnDestroy()以防止内存泄漏。 我可以在服务的构造函数中订阅它吗?我应该何时何地取消订阅?或者,当我在应用程序模块级别将我的服务注册为提供商时,也许没有必要?


StatisticsService应订阅主题和群组列表。您的各个组件应该只订阅它们各自的服务(ThemeComponent 到 ThemeService、Group 到 Group 等)。

为了简单起见,我将只关注ThemeService but GroupService很相似。ThemeService应该有一个内部Subject当调用remove时,Subject接下来将是一个值(可能是整个新列表)。

StatisticsService将订阅ThemeService变化后可观察并重新计算。它看起来像这样

/* theme.service.ts */
@Injectable()
export class ThemeService {
    private _list$ = new Subject<ThemeList>();

    get list(): Observable<ThemeList> {
        return this._list$.asObservable();
    }

    set list(newList: ThemeList) {
       this._list$.next(newList);
    }
}


/* statistics.service.ts */
@Injectable()
export class StatisticsService {
    private _calculation$ = new Subject<StatisticResult>();

    constructor(private themeService: ThemeService) {
        themeService.list.subscribe((themeList: ThemeList) => this.updateCalculation(themeList));
    }

    get calculation(): Observable<StatisticResult> {
        return this._calculation$.asObservable();
    }

    updateCalculation(newData: ThemeList | GroupList) {
        // ... do stuff
        this._calculation.next(statisticResult);
    }
}


/* statistics.component.ts */
@Component({
  selector: 'statistics',
  template: '<p>{{ statisticResult$ | async }}</p>'
})
export class StatisticsComponent {
    statisticResult$: Observable<StatisticResult>;

    constructor(private statisticsService: StatisticsService) {
        this.statisticResult$ = statisticsService.calculation;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 跨服务通信 的相关文章

随机推荐

  • 使用 java 查询 MySQL 数据库

    伙计们 简单地说 我有一个带有文本输出框的java应用程序 我想查询数据库并将输出显示到文本框中 示例我有一个包含两列的数据库food and color 我想 SELECT in Table WHERE color blue 有什么建议么
  • 为什么我的 tempdb 在服务器重新启动时会重置权限?

    过去两次我们重新启动 SQL Server 我们的网站就瘫痪了 原因似乎是因为 tempdb 正在重新创建 并且 ASPState 用户失去了读 写 tempdb 的权限 它是 ASP 站点 会话数据存储在 sql server 中 直到大
  • 编写 jax-ws Web 服务并生成 WSDL,无需 XSD

    我在java上为tomcat应用程序服务器编写了一个简单的JAX WS Web服务 我有一个接口和实现类 界面 WebService name myWs SOAPBinding style Style RPC public interfac
  • R:不同日期的栅格图层之间的插值

    假设我有 4 个具有相同扩展的栅格图层 其中包含 4 个不同年份的数据 2006 2008 2010 和 2012 library raster r2006 lt raster ncol 3 nrow 3 values r2006 lt 1
  • 如何在rhino javascript中将对象属性添加到全局对象

    我想将对象中的一些属性添加到全局命名空间中 在浏览器上的 javascript 中 我可以将其添加到window像这样的对象 var myObject foo function alert hi and many more properti
  • jQuery 仅在第二次单击时工作

    谁能指出为什么我在第一次单击时无法弹出警报的问题 它仅在每秒一次点击时起作用 即 在奇数点击时不起作用 在偶数点击时起作用 HTML div class slider div class slider box ui slider ui sl
  • 将数组写入 Excel 范围

    我目前正在尝试使用以下代码将数据从对象数组写入 Excel 中的范围 其中objData只是一个字符串数组 private object m System Type Missing object objData getDataIWantTo
  • JavaScript Lint inc_dec_within_stmt 警告

    有人可以解释 javascriptlint 不是 jslint 发出警告的原因 重要性吗 inc dec within stmt increment and decrement operators used as part of great
  • 如何仅覆盖多个背景图像声明中的第二个图像?

    如何利用级联仅覆盖多个背景图像声明中的第二个图像 我已经指定了一个标准样式lis 有两个背景图像 小猫和右侧的鱼 我还指定了一个样式li secondary我只想更改两个背景图像中的第二个 li background url data im
  • 为什么 Visual Studio 单元测试中的每个测试都会触发 TestInitialize?

    我正在使用 Visual Studio 2010 Beta 2 我有一个 TestClass 其中有一个 TestInitialize TestCleanup 和一些 TestMethods 每次运行测试方法时 初始化和清理方法也会运行 我
  • 无法在UITableViewCell的drawRect中绘制

    我在自定义 UITableViewCell 的 drawRect 方法中绘图时遇到问题 这是我正在使用的代码 void drawRect CGRect rect CGContextRef ctx UIGraphicsGetCurrentCo
  • PHP发送邮件附件

    我找到了post https stackoverflow com questions 3092821 php send e mail with attachment关于向邮件添加附件 问题是如何将上传的文件与该功能连接起来 我必须通过什么
  • 在执行测试之前等待自己的函数(返回一个承诺)

    我有自己的函数 调用测试控制器服务器来重置数据库 它返回一个承诺 该承诺在数据库成功重置后完成 function resetDatabase returns a promise for my REST api call 我的目标是能够在所有
  • 防止Python中的函数覆盖[重复]

    这个问题在这里已经有答案了 有什么方法可以防止子类覆盖基类中的方法吗 我的猜测是没有 但我来自 NET 世界 并且我正在努力使我的 API 尽可能强大 因此非常感谢任何输入 class Parent def do something sel
  • Angular 2 错误:尝试使用被破坏的视图:DetectChanges 错误:尝试使用被破坏的视图:ViewDestroyedError 处的 detectorChanges

    我正在使用 ng2 toastr 并收到以下错误 https www npmjs com package ng2 toastr https www npmjs com package ng2 toastr Attempt to use a
  • 如何防止请求返回304

    浏览器什么时候不向服务器发出文件请求 换句话说 我有一个正在提供服务的 JavaScript 文件 它的 HTTP 响应头有一个ETag Cache Control public and Expires Tue 19 Jan 2038 03
  • 如何解决 VS Code 不支持车把部分的问题?

    我使用车把作为我的项目的模板引擎 我正在使用 Prettier 进行格式化 但在格式化 hbs 文件期间我收到错误 SyntaxError 不支持车把部分 我尝试在互联网上寻找解决方案但失败了 这是完整的错误日志 SyntaxError 不
  • 断言两个 java bean 是等价的

    这个问题 https stackoverflow com questions 472626 how to generically compare entire java beans很接近 但仍然不是我想要的 我想以通用的方式断言两个 bea
  • 有没有办法让 ANT 任务在 Windows Vista 中以管理员身份运行?

    作为安装程序的一部分 我需要从 ANT 运行批处理文件 如果我以管理员身份运行 cmd exe 并运行批处理文件 一切都会很好 因为它具有适当的管理权限 当从 ant 执行批处理文件时 它会失败 就像我在没有管理权限的情况下运行批处理文件一
  • Angular 跨服务通信

    我有一个统计应用程序 在我的页面左侧有主题列表 顶部有组列表 主要部分包含与主题和组相关的统计项目 我还有几个服务为我的应用程序提供业务逻辑 为了简单起见 我们来谈谈其中的三个 主题服务 群组服务 and 统计服务 最终用户可以操作主题和组