Javascript 将事件传递给Angular 2应用程序中不是另一个组件的父级或子级的组件

Javascript 将事件传递给Angular 2应用程序中不是另一个组件的父级或子级的组件,javascript,angular,typescript,Javascript,Angular,Typescript,我正在尝试找出一种最简单的方法,当事件不共享父子关系时,将事件从一个Angular 2组件传递到另一个组件 具体来说,我有一个用于打开对话框的组件(当单击时,新组件将打开)。用户单击新对话框组件上的按钮后,我希望将该事件的通知发送回原始组件(单击按钮打开对话框/组件开始),以便在那里启动函数 以下是原始组件中用于触发对话框打开的代码: public onResponseSelected(option, selectedService) { const primaryEmail = thi

我正在尝试找出一种最简单的方法,当事件不共享父子关系时,将事件从一个Angular 2组件传递到另一个组件

具体来说,我有一个用于打开对话框的组件(当单击时,新组件将打开)。用户单击新对话框组件上的按钮后,我希望将该事件的通知发送回原始组件(单击按钮打开对话框/组件开始),以便在那里启动函数

以下是原始组件中用于触发对话框打开的代码:

public onResponseSelected(option, selectedService)
{
    const primaryEmail = this.getPrimaryEmail();

    let currentService = this.selectedService;
    let activeList = this.getActiveList();

    if (option && option.toString() === 'Follow-up Required')
    {
        // Create dialog
        let dialogRef: MdDialogRef<ResponseProcessComponent>
            = this.mdDialog.open(ResponseProcessComponent, {
                disableClose: true,
                data: {
                    option: option,
                    currentService: currentService,
                    primaryEmail: primaryEmail,
                    activeList: activeList
                }
            });

        dialogRef = null;

    }
}
public on responseselected(选项,selectedService)
{
const primaryEmail=this.getPrimaryEmail();
让currentService=this.selectedService;
让activeList=this.getActiveList();
if(option&&option.toString()==“需要跟进”)
{
//创建对话框
让dialogRef:MdDialogRef
=this.mdDialog.open(ResponseProcessComponent{
disableClose:对,
数据:{
选项:选项,
currentService:currentService,
primaryEmail:primaryEmail,
活动列表:活动列表
}
});
dialogRef=null;
}
}
我正在“打包”一些数据,作为“数据”的一部分发送到对话框组件。一切都按预期进行

现在,我只需要一种方法将事件触发器从对话框组件(responseProcessComponent)发送回原始组件。提醒一下,这里没有共享视图,所以我不能通过Input()传递这些视图,就好像它们是具有父子关系的组件一样


我只需要一种方法来触发对话框组件中的事件,并将其发送回另一个组件。最简单的方法是什么?

您可以使用共享服务并从注入该服务的任何组件发送通知

考虑以下几点:

dialog.service.ts

import {Injectable} from '@angular/core';
import {BehaviorSubject} from 'rxjs/BehaviorSubject';


@Injectable()
export class DialogService {

  public dialog = new BehaviorSubject<string>('Not Clicked');
  dialogObservable = this.dialog.asObservable();

  changeDialogState (value: string): void {
    this.dialog.next(value);
  }
}
要为对话框设置新状态,请执行以下操作:

changeDialogState(){
this.ds.changeDialogState('Cliked');
}

不要忘了在同一模块的provides数组中添加服务,在declarations数组中添加组件,这样就不会出现任何错误

您可以使用共享服务并从注入该服务的任何组件发送通知

考虑以下几点:

dialog.service.ts

import {Injectable} from '@angular/core';
import {BehaviorSubject} from 'rxjs/BehaviorSubject';


@Injectable()
export class DialogService {

  public dialog = new BehaviorSubject<string>('Not Clicked');
  dialogObservable = this.dialog.asObservable();

  changeDialogState (value: string): void {
    this.dialog.next(value);
  }
}
要为对话框设置新状态,请执行以下操作:

changeDialogState(){
this.ds.changeDialogState('Cliked');
}

不要忘了在同一模块的provides数组中添加服务,在declarations数组中添加组件,这样就不会出现任何错误

正如我提到的,在这里使用共享服务不是一个理想的选择。没有其他选择吗?@Ademo没有。你最好的选择是使用服务好的,我想这可能是一个非常简单的服务实现。我将尝试并注入这两个组件,因为听起来似乎没有其他选项。唯一的选项,对于不相关的组件,使用单例服务的BehaviorSubject。正如我所提到的,在这里使用共享服务不是一个理想的选项。没有其他选择吗?@Ademo没有。你最好的选择是使用服务好的,我想这可能是一个非常简单的服务实现。我将尝试并注入这两个组件,因为听起来似乎没有其他选项。唯一的选项,对于不相关的组件。我认为,如果你不取消订阅共享服务,你就造成了内存泄漏。@bryan60是的,我知道,但忘了提一下。所以Ademo在你的Ngondestory生命周期钩子中,请取消订阅以避免内存泄漏。祝你的项目好运。我不知道这是否重要,但上面的
receiver
拼错了-这个词应该拼写为“receiver”。仅供参考,如果你不取消订阅共享服务,你就造成了内存泄漏。@bryan60是的,我知道,但忘了提及它。所以Ademo在你的Ngondestory生命周期钩子中,请取消订阅以避免内存泄漏。祝你的项目好运。我不知道这是否重要,但是上面的
receiver
拼错了-单词应该拼写为“receiver”。