Angular 通过单个调用在两个组件之间进行通信

Angular 通过单个调用在两个组件之间进行通信,angular,rxjs,observable,Angular,Rxjs,Observable,我被困在一个基本场景中,在这个场景中,我有一个组件(component1),当我执行某个操作时,我想从另一个组件获取一些数据(确切地说,我是从(component2)发送一些内容) 目前,我正在使用两个通过公共服务共享的主题进行此操作,首先,我正在广播来自组件1的一些数据,这些数据在component2中订阅,然后执行一些操作,组件2将向我发送我在component1中订阅的响应。有关详细信息,请参阅上文napshot,如上所述,两个组件互不相关 我想要实现的是有一个单一调用,当我在compo

我被困在一个基本场景中,在这个场景中,我有一个组件(
component1
),当我执行某个操作时,我想从另一个组件获取一些数据(确切地说,我是从(
component2
)发送一些内容)

目前,我正在使用两个通过公共服务共享的主题进行此操作,首先,我正在广播来自组件1的一些数据,这些数据在
component2
中订阅,然后执行一些操作,组件2将向我发送我在
component1
中订阅的响应。有关详细信息,请参阅上文napshot,如上所述,两个组件互不相关

我想要实现的是有一个单一调用,当我在
component1
中执行操作时,它将调用
component2
,我将得到响应,请提供一些建议和指导

请求的代码

组件1.ts

click(data) {
  subject1.next(data);
  subject2.subscribe(s => {
    alert(s);
  });
}
subject1.subscribe(s => {
  subject2.next(s+10);
});
组件2.ts

click(data) {
  subject1.next(data);
  subject2.subscribe(s => {
    alert(s);
  });
}
subject1.subscribe(s => {
  subject2.next(s+10);
});

我想你可以写下你自己可以观察到的东西:

类服务{
订阅
消费者订阅(订阅){
this.subscription=订阅;
}
ConsumerRunSubscribe(){
this.subscription=null;
}
图书馆订阅(){
返回订阅();
}
}
组成部分1:

点击(数据){
this.service.librarySubscription(data.subscribe=>alert);
}
组成部分2:

this.service.consumerSubscribe(s=>of(s+10))//允许使用者使用异步方法——您可以使用同步ofc。
this.service.ConsumerRunSubscribe();//消费者将需要取消搜索,但对于正常的可观察对象也是如此

注:您可以使用例如
Subject
和它的私有字段来做同样的事情,顺便说一句,我觉得这里有点问题,但如果不知道最初的问题,很难说更多…

您的两个组件都可以从
app.component.ts
获得,不是吗??(或者任何其他包含这两个组件的父组件)

下面的方法是涵盖您的用例的更自然的方法,您当前使用服务的方式在我看来就像是一种反模式

使用:

组件1.ts

click(data) {
  subject1.next(data);
  subject2.subscribe(s => {
    alert(s);
  });
}
subject1.subscribe(s => {
  subject2.next(s+10);
});
@Output()
public dataReady=new EventEmitter();
单击(数据){
dataReady.emit(数据);
}
财务数据(数据){
log('数据已由组件2处理,结果:',数据);
}
组件2.ts

click(data) {
  subject1.next(data);
  subject2.subscribe(s => {
    alert(s);
  });
}
subject1.subscribe(s => {
  subject2.next(s+10);
});
@Output()
public dataProcessed=new EventEmitter();
processData(数据){
//在组件2中使用以下数据执行任何操作:s+10?
dataProcessed.emit(数据);
}
在组件的容器中:



但是,如果您的两个组件都“太远”,无法调用彼此的事件,我认为正确的方法是在服务中处理数据,而不使用组件2(通过将“processData”代码从组件2移动到服务)

你能分享相关的代码吗?请在快照中分享,你还需要什么?我认为这是一个很好的解决方案。你可以通过其他方式来实现,比如在服务中注册组件,然后从组件访问公共方法,但我认为这没有那么好。你知道什么是InjectionToken吗是以及如何使用它们?它们允许您非常轻松地解耦依赖项。如果这是您感兴趣的内容,我可以发布一个答案/解释?谢谢,@JonathanStellwag在您的评论后,我提到了InjectionToken,它将解耦依赖项,但我想使用InjectionToken可以解决我的问题,我可以创建一个objec我的组件2的t,并将其注入到组件1中,并在每个操作中使用它,但在这里我不能这样做。正如您所看到的,这两个组件都在不同的项目/库中,组件1是库的一部分,其中组件2是该库的使用者,如果相反,我可以给它一个tryPretty体面的方法,让我给它一个try@Petr断言yanov可能在方法
librarySubscription(){return subscription();}
中有输入错误。它不应该是
librarySubscription(data){return this.subscription(data);}