Angular 2父子组件之间通过服务进行通信
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)得知服务收到了'火星',但无法使父组件输出'火星'。
我想知道是否因为子组件在子目录中的原因。
感谢您的时间!
Angular 2父子组件之间通过服务进行通信的问题是如何解决的?
在Angular 2中,父组件向子组件传递数据的一种方式是在子组件中定义一个()
声明,当需要传递数据时,通过触发该声明来发射一个对象。然而,这种方式很快会变得混乱不堪。
如果想要使用服务来解决这个问题,可以创建一个存储所有值的对象,并将其添加到服务类中。然后,在服务中创建获取器/设置器,并让子组件使用这些获取器/设置器来访问数据。stackoverflow上有一些示例代码(链接)。
根据问题描述,我理解你所做的和你想要做的是一样的。问题在于这种方式不起作用。
echonax在之前回答中已经给出了解决方法。stackoverflow上的一个回答(链接)给出了解释。