7

我试图遵循这个答案,但它在兄弟组件之间捕获的 Angular 2 事件太令人困惑了

当在子组件 2上单击某些东西时,我想在子组件 1中调用一个方法

子组件 2 发出一个名为 trackClick 的事件。

父组件:

<div>

    <audio-player></audio-player>

    <audio-albums></audio-albums>

</div>

子组件 1(音频播放器)

// Don't know what to do here, want to call this function

trackChanged(track){
    console.log("YES!! " + track);
}

子组件 2(音频专辑)

<li class="track" (click)="playTrack(track)"> </li>

@Output() trackClick = new EventEmitter<any>();

playTrack(track):void{
    console.log("calling playTrack from child 2:" + track);  
    this.trackClick.next([track]);
}
4

3 回答 3

8

你不能这样做。首先,您必须使用 @ViewChild(Child2) 在父级中获取 child2 (按组件而不是字符串选择 ViewChild 很重要)。然后你必须在父级中捕获事件并在 child2 上执行你想要的任何方法。或多或少是这样的:

import { AudioAlbumsComponent }  from '...';
import { AudioPlayerComponent }  from '...';

@Component({ 
  template: `
    <div>
      <audio-player></audio-player>
      <audio-albums (trackClick)="onTrackClicked($event)"></audio-albums>
    </div>`,
  directives: [AudioPlayerComponent, AudioAlbumsComponent],
}) 

export class Parent {
  @ViewChild(AudioPlayerComponent) private audioPlayer: AudioPlayerComponent;

  onTrackClicked($event) {
    this.audioPlayer.trackChanged($event);
  }

}
于 2016-08-24T20:30:03.940 回答
8

另一种(仅模板方式)是

<audio-player #audioPlayer></audio-player>
<audio-albums (trackClick)="audioPlayer.trackChanged($event)"></audio-albums>

<audio-player>模板变量引用的事件处理程序#audioPlayer

于 2016-08-25T04:45:47.513 回答
2

像这样的东西:

家长

<div>
    <audio-player (trackchanged)="trackChanged($event);></audio-player>
    <audio-albums></audio-albums>
</div>

@ViewChild(Child2) child2Component: Child2Component;

trackChanged(value:any) {
 child2Component.trackChanged(value);
}

孩子1

...
@Output() trackchanged= new EventEmitter();
...
playTrack() {
    this.trackchanged.emit({value: this.track});
}

孩子2

trackChanged(track){
    console.log("YES!! " + track);
}
于 2016-08-24T20:37:11.803 回答