当前位置: 首页 > Web前端 > HTML

使用Rxjs解决AngularComponents之间的通信问题

时间:2023-04-02 14:21:42 HTML

本文讨论了两个AngularComponents不知道对方的存在,没有共享父子Component时如何通信。在包括Angular在内的许多前端框架中,当我们将应用程序或页面分成许多小的UI组件并将事件绑定到嵌套多层的组件时,总是会出现通信问题。在Angular中,我们使用@Output()和@Input()。这在正常情况下工作正常,但是当我们想要将传入数据和传出事件绑定到容器组件时,管理起来可能是一场噩梦。我们需要在许多级别的组件上添加很多@Input()和@Output()。本文介绍两种解决方案:使用Subject的EventBus。具有行为主题的可观察服务。讨论的场景是有一个包含许多文章列表的Angular组件。单击一个项目以查看文章详细信息。事件总线解决方案我们创建了一个全球可用的事件总线服务。然后,我们可以向总线发出事件,如果有任何监听器注册到该事件名称,那么它将执行回调函数。在本文中,我将使用RsJS主题来创建事件总线服务。从文章列表中,每次用户点击该项目时,它都会发出一个事件并将文章数据传递给事件总线。上面的代码展示了事件SelectArticleDetail是如何和选中的文章数据一起通过事件总线发送出去的。接下来,我们使用ArticleDetailComponent中事件总线服务的on方法来监听后者抛出的SelectArticleDetail事件。我们这里定义的回调函数将事件总线服务抛出的Article数据保存到Component属性detail中。ObservableServiceSolution的思路很简单,就是创建一个库存,传递里面的值。所以每次股票变动,观察者都会知道并执行回调。我们创建一个BehaviorSubject,它有一个名为inventorySubject$的默认文章值和一个addToInventory()方法来将文章添加到库存中。在文章列表中,每当用户点击一个项目时,Observable服务的addToInventory方法就会被调用,将当前文章传递给this.inventorySubject$.next方法。然后在articledetailComponent中我们订阅了this.inventorySubject$的变化:什么时候使用这两种方案?我们使用ObservableService订阅简单案例的数据,我们使用EventBus将不同的事件名称派发给不同的侦听器。更多Jerry原创文章在这里:《王子熙》: