孩子在Angular 2中听父母事件

时间:2016-06-07 10:41:40

标签: javascript typescript angular rxjs eventemitter

在角度文档中,有一个关于听父母的儿童事件的话题。没关系。但我的目的是反向的!在我的应用程序中有一个'admin.component',它包含管理页面的布局视图(侧边栏菜单,任务栏,状态等...)。 在这个父组件中,我配置了路由器系统,用于更改管理员其他页面之间的主视图。 问题是在更改后保存内容,用户单击任务栏中的保存按钮(放在admin.component中),子组件必须侦听该click事件以执行保存人员。

4 个答案:

答案 0 :(得分:101)

为了后人,我只想提一下更常规的解决方案:只需获取对ViewChild的引用,然后直接调用其中一种方法。

@Component({
  selector: 'app-child'
})
export class ChildComponent {

  notifyMe() {
    console.log('Event Fired');
  }
}

@Component({
  selector: 'app-parent',
  template: `<app-child #child></app-child>`
})
export class ParentComponent {

  @ViewChild('child')
  private child: ChildComponent;

  ngOnInit() {
    this.child.notifyMe();
  }
}

答案 1 :(得分:82)

我认为这份文档对您有所帮助:

事实上,您可以利用父母为其子女提供的可观察/主题。这样的事情:

@Component({
  (...)
  template: `
    <child [parentSubject]="parentSubject"></child>
  `,
  directives: [ ChildComponent ]
})
export class ParentComponent {
  parentSubject:Subject<any> = new Subject();

  notifyChildren() {
    this.parentSubject.next('some value');
  }
}

子组件可以简单地订阅此主题:

@Component({
  (...)
})
export class ChildComponent {
  @Input()
  parentSubject:Subject<any>;

  ngOnInit() {
    this.parentSubject.subscribe(event => {
      // called when the notifyChildren method is
      // called in the parent component
    });
  }

  ngOnDestroy() {
    // needed if child gets re-created (eg on some model changes)
    // note that subsequent subscriptions on the same subject will fail
    // so the parent has to re-create parentSubject on changes
    this.parentSubject.unsubscribe();
  }

}

否则,您可以以类似的方式利用包含此类主题的共享服务...

答案 2 :(得分:8)

如果我正确理解了这个问题,可能会有更简单的方法。假设 -

  • OP在父组件
  • 中有一个保存按钮
  • 需要保存的数据位于子组件
  • 可以从服务
  • 访问子组件可能需要的所有其他数据

在父组件

<button type="button" (click)="prop1=!prop1">Save Button</button>
<app-child-component [setProp]='prop1'></app-child-component>

在孩子身上..

prop1:boolean;
  @Input()
  set setProp(p: boolean) {
    // -- perform save function here
}

这只是将按钮单击发送到子组件。子组件可以从那里独立保存数据。

编辑:如果父模板中的数据也需要与点击按钮一起传递,这也可以通过这种方法实现。如果是这种情况,请告诉我,我将更新代码示例。

答案 3 :(得分:0)

对于那些获得Cannot read property 'notifyMe' of undefined

的人

尝试在ngAfterViewInit()接口的ngOnInit()内部调用方法