使用服务的角度子到父通信

Posted

技术标签:

【中文标题】使用服务的角度子到父通信【英文标题】:Angular child to parent communication using service 【发布时间】:2018-08-12 21:25:44 【问题描述】:

我在不同的地方看到了使用输入、服务和模板变量的父子组件之间的通信。

如果我想从子组件到父组件进行通信,我们可以使用输出发射器。

有没有办法使用服务从子组件到父组件进行通信? 问题是如果我们有两个克隆组件,例如:

在 parent.component.ts 中

<child-component></child-component>
<child-component></child-component>

使用发射器,我们可以为每个发射器使用回调函数,如下所示

<child-component (someevent) = "callback1($event)"></child-component>
<child-component (someevent) = "callback2($event)"></child-component>

使用服务我们如何设计与发射器一样的功能?

【问题讨论】:

【参考方案1】:

当您需要在孩子和父母之间以及兄弟姐妹之间共享数据时,这非常简单,也是一个好主意。 Behvaior 求救:

您的服务

@Injectable()
export class DataService 
    dataSrc$ = new BehaviorSubject('default data');

  changeData(data) 
    this.dataSrc$.next(data);
  

子组件

@Component(...)
export class ChildComponent 
    data: any;

  constructor(private dataSvc: DataService) 

  ngOnInit() 
    this.dataSvc(data => 
        this.data = data // do whatever you want with it
    )
  

  sendToParent(data) 
    this.dataSvc.changeData(data);
  

父组件

@Component(...)
export class ParentComponent 
    data: any;

  constructor(private dataSvc: DataService) 

  ngOnInit() 
    this.dataSvc(data => 
        this.data = data // do whatever you want with it
    )
  

  sendToChild(data) 
    this.dataSvc.changeData(data);
  

显然为您的方法想出更好的名称,但希望您能理解。

【讨论】:

如果我们有两个子组件实例基本上是一个克隆,你如何区分哪些数据来自哪个子组件? 你能举一个现实生活中的例子,你希望有两个相同的子组件吗? 另外,如果只有两个,最好使用 EventEmitter(您发布的版本),只需将孩子的 id 作为第二个参数传递给一个回调,而不是有两个回调 现实生活中的例子是 some contentsome other contentt 好吧,这不是一个真实的例子:D【参考方案2】:

使用服务时,您应该将服务的 Observable 订阅一次到您父母的代码中,并且您必须将一些内容放入您 .next() 来自孩子的事件中,以便您能够识别哪个孩子发出了事件。

【讨论】:

以上是关于使用服务的角度子到父通信的主要内容,如果未能解决你的问题,请参考以下文章

子到父事件发出

子到父数据Vue JS

vue 组件间传值: 父到子,子到父,兄弟间

vue中组件通讯--子到父

在 React Hooks 中通信组件的简单而正确的方法是啥?

Legacy CodeForces