Angular 2父子组件之间通过服务进行通信

19 浏览
0 Comments

Angular 2父子组件之间通过服务进行通信

我有一个Angular 2应用程序,结构如下:

app (目录)
|-parent(目录)
 -parent.component
 -global.service(用于与子组件通信)
    |-child1 (目录)
     -child1.component
    |-child2 (目录)
     -child2.component

其中app目录包含parent目录,parent目录包含其组件、服务和一个子目录。

我试图实现Angular.io上的Mission服务示例: Parent and children communicate via a service

服务

import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class GlobalService {
  // Observable string sources
  private missionAnnouncedSource = new Subject();
  private missionConfirmedSource = new Subject();
  // Observable string streams
  missionAnnounced$ = this.missionAnnouncedSource.asObservable();
  missionConfirmed$ = this.missionConfirmedSource.asObservable();
  // Service message commands
  announceMission(mission: string) {
    this.missionAnnouncedSource.next(mission);
  }
  confirmMission(astronaut: string) {
    this.missionConfirmedSource.next(astronaut);
  }
}

父组件

@Component({
  selector: 'parent',
  templateUrl: './app/parent/parent.component.html',
  styleUrls: ['./app/parent/parent.component.css'],
  providers: [GlobalService]
})
export class ParentComponent {
  constructor(private globalService: GlobalService) {
    globalService.missionConfirmed$.subscribe(
      astronaut => {
        console.log('filter ' + astronaut);
      },
      (error: string) => {
        console.log('filter error')
      },
      () => {
        console.log('filter done fetching')
      });
  }
}

子组件1

@Component({
  selector: 'child1',
  templateUrl: './app/parent/child1/child1.component.html',
  styleUrls: ['./app/parent/child1/child1.component.css'],
  providers: [GlobalService]
}) 
export class ChildComponent {
  filterFormSubmit(filterFormValue: JSON): void {
    this.filterFormValue = filterFormValue;
    this.globalService.confirmMission('火星')
  }
}

当子组件方法触发时,我通过console.log(mission)得知服务收到了'火星',但无法使父组件输出'火星'。

我想知道是否因为子组件在子目录中的原因。

感谢您的时间!

0
0 Comments

问题的原因是没有在包含这些组件的模块中提供服务,导致服务变成了单例。解决方法是在包含这些组件的模块中提供服务,或者在这些组件的父组件中提供服务。如果在组件中提供了服务,Angular的依赖注入系统会使用在DI树上找到的第一个提供者。

0
0 Comments

Angular 2父子组件之间通过服务进行通信的问题是如何解决的?

在Angular 2中,父组件向子组件传递数据的一种方式是在子组件中定义一个()声明,当需要传递数据时,通过触发该声明来发射一个对象。然而,这种方式很快会变得混乱不堪。

如果想要使用服务来解决这个问题,可以创建一个存储所有值的对象,并将其添加到服务类中。然后,在服务中创建获取器/设置器,并让子组件使用这些获取器/设置器来访问数据。stackoverflow上有一些示例代码(链接)

根据问题描述,我理解你所做的和你想要做的是一样的。问题在于这种方式不起作用。

echonax在之前回答中已经给出了解决方法。stackoverflow上的一个回答(链接)给出了解释。

0