Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过在服务中保持组件引用在angular4同级组件之间通信_Angular - Fatal编程技术网

通过在服务中保持组件引用在angular4同级组件之间通信

通过在服务中保持组件引用在angular4同级组件之间通信,angular,Angular,我希望在两个兄弟姐妹angular4组件之间进行通信 我读过这个文档:但我在考虑一个解决方案,即服务包含一个组件(需要访问)引用 服务包含对第二个组件的引用第一个组件使用服务访问第二个组件引用并执行其中的任何方法 此解决方案允许同步执行方法 这是一个正在工作的plunker: 我的问题是关于这个代码设计 它实际上不是一个不推荐的循环依赖项吗?或者这可能是解决同级组件之间通信的合理方案?您应该以松散耦合的方式安排组件之间的通信。但是您的代码具有紧密耦合。您的服务知道有两个组件。如果需要引入需要相

我希望在两个兄弟姐妹angular4组件之间进行通信

我读过这个文档:但我在考虑一个解决方案,即服务包含一个组件(需要访问)引用

服务
包含对
第二个
组件的引用<代码>第一个组件使用
服务
访问
第二个
组件引用并执行其中的任何方法

此解决方案允许同步执行方法

这是一个正在工作的plunker:

我的问题是关于这个代码设计


它实际上不是一个不推荐的循环依赖项吗?或者这可能是解决同级组件之间通信的合理方案?

您应该以松散耦合的方式安排组件之间的通信。但是您的代码具有紧密耦合。您的服务知道有两个组件。如果需要引入需要相同服务的第三个组件,该怎么办?根据您的plunker,您需要修改服务


服务不应该知道谁在使用它的数据。在服务器内创建主题的实例,并让第一个组件对此主题调用next()。第二个组件可以订阅此主题。如果第三个组件需要这些数据,那么第三个组件可以订阅相同的主题,并且不需要更新服务的代码。我录制了一段视频,演示了如何以这种方式安排组件间通信:

您应该以松散耦合的方式安排组件间的通信。但是您的代码具有紧密耦合。您的服务知道有两个组件。如果需要引入需要相同服务的第三个组件,该怎么办?根据您的plunker,您需要修改服务


服务不应该知道谁在使用它的数据。在服务器内创建主题的实例,并让第一个组件对此主题调用next()。第二个组件可以订阅此主题。如果第三个组件需要这些数据,那么第三个组件可以订阅相同的主题,并且不需要更新服务的代码。我录制了一段视频,展示了如何以这种方式安排组件间通信:

我同意雅科夫的观点,因为这似乎不是一个好的做法

但是,我不推荐一个主题或行为主题,而推荐一个简单的服务。我举了一个例子:


我更新了您的plunker以说明:


我同意雅科夫的观点,这似乎不是一个好的做法

但是,我不推荐一个主题或行为主题,而推荐一个简单的服务。我举了一个例子:


我更新了您的plunker以说明:


我更熟悉那个主题模式。问题是下一步是异步的。如果我需要等待第二个组件结束它需要做的事情,该怎么办?我需要另一个主题,然后从第二个组件调用next。这有点混乱。“如果你需要引入需要相同服务的第三个组件怎么办?基于你的plunker,你需要修改服务。”-不。第三个服务只需要从全局注入器获得一个引用,这就是我更熟悉的主题模式。问题是下一步是异步的。如果我需要等待第二个组件结束它需要做的事情,该怎么办?我需要另一个主题,然后从第二个组件调用next。这有点混乱。“如果您需要引入需要相同服务的第三个组件,该怎么办?基于您的plunker,您需要修改服务。”-不。第三个服务只需要从全局注入器获取一个引用,这就是您的解决方案仅在共享数据的情况下才考虑的问题。如果我想触发动作呢?你能举个例子吗?假设第二个组件想触发一些第一个组件方法(同步),正如Yakov所说,兄弟组件直接通信会导致紧密耦合。通常情况下,您会设置它们都与服务通信,或者它们都通知父级,然后通知其他子级。我更新了您的plunker以说明:您的解决方案只涉及共享数据的情况。如果我想触发动作呢?你能举个例子吗?假设第二个组件想触发一些第一个组件方法(同步),正如Yakov所说,兄弟组件直接通信会导致紧密耦合。通常,您会设置它们都与服务通信,或者它们都通知父级,然后通知其他子级。我更新了您的plunker以说明:
import { Injectable } from '@angular/core';

@Injectable()
export class GlobalCommunicator {
  private message: string;
}