【问题标题】:Communicate between sibling components Angular 2在兄弟组件Angular 2之间进行通信
【发布时间】:2017-01-01 02:59:31
【问题描述】:

我试图遵循这个答案,但它太令人困惑了Angular 2 event catching between sibling components

当点击子组件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]);
}

【问题讨论】:

    标签: angular eventemitter angular2-components


    【解决方案1】:

    你不能这样做。首先,您必须使用 @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);
      }
    
    }
    

    【讨论】:

    • 好的,我担心它必须是 child2->parent->child1,谢谢我试试
    【解决方案2】:

    另一种选择(仅模板方式)是

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

    事件处理程序通过模板变量#audioPlayer引用&lt;audio-player&gt;

    【讨论】:

    • 哦,很好,这比通过父母要好得多...谢谢!
    【解决方案3】:

    类似这样的:

    父母

    <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);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-18
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 2018-08-21
      • 2016-07-08
      • 2017-05-04
      相关资源
      最近更新 更多