Angular-5, как получить данные от нескольких дочерних элементов к родительскому, используя одно событие?

У меня есть сценарий, в котором у меня есть 3 вкладки на моей веб-странице, где в области содержимого вкладок при активации каждой вкладки загружаются три разных компонента (скажем, компоненты «ABC», «PQR», «XYZ»). На главной странице, на которой присутствуют вкладки, я должен показать некоторые данные заголовка, связанные с содержимым вкладки, загруженным на вкладку. Предположим, если вкладка BAC загружена, я должен показать какое-то сообщение, отправленное из ABCcomponent, аналогично для всех трех компонентов.

Я пробовал с одним компонентом, но мой список событий не работает.

Главная страница вкладок (родительский компонент): файл HTML tabs.component.html:

 <h1>{{headerMessage}}</h1>

<my-tabs [items]="tabItems">
    <router-outlet (tabHeaderTextEvent)="receiveHeaderText($event)"></router-outlet>
</my-tabs>

tabs.component.ts:

import { Component, OnInit } from '@angular/core';
import { TabItem } from '@MYCOMPONENTS/tabs';

@Component({
  selector: 'MYPAGE-tabs',
  templateUrl: './tabs.component.html',
  styleUrls: ['./tabs.component.scss']
})
export class TabsComponent implements OnInit {
  public headerMessage: String;
  public tabItems: TabItem[] = [];

  constructor(private authService: AuthService) {
    this.tabItems = [{
      routerPath: 'abc',
      label: 'ABC_LABEL',
    }, {
      routerPath: 'PQR',
      label: 'PQR_LABEL',
      disabled: true
    },
    {
      routerPath: 'XYZ',
      label: 'XYZ_LABEL',
      disabled: true
    }];
  }

  receiveHeaderText($event) {
    console.log('***********************************');
    console.log($event);
    this.headerMessage = $event;
  }
}

Child.component.ts (откуда я хочу отправить данные):

import { Component, OnInit, Output, EventEmitter } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';

@Component({
    selector: 'someSelector',
  templateUrl: './sometemplate.component.html'
})
export class Child implements OnInit {
  @Output() tabHeaderTextEvent = new EventEmitter<string>();

  constructor() {
    this.tabHeaderTextEvent.emit('hello from overview component');
  }
}

Точно так же у меня есть еще два компонента, которые генерируют tabHeaderTextEventevent при вызове конструктора. Но моя функция прослушивания в моем компоненте вкладки никогда не вызывается. Может ли кто-нибудь указать мне, где я ошибаюсь? ИЛИ Любой лучший подход для достижения того же. Заранее спасибо.


person Anonymous    schedule 19.07.2018    source источник
comment
Короткий ответ: вы не можете передавать данные через привязки на router-outlet. stackoverflow .com/questions/41451375/ Хотя этот вопрос относится к входным данным, то же самое верно и для выходных данных. Вам, вероятно, понадобится общий сервис, чтобы обойти это.   -  person Vlad274    schedule 19.07.2018


Ответы (1)


Вы можете попробовать использовать Injector.

import { Injector } from '@angular/core';
import { MyPageComponent } from "./mypage.component";
export class Child implements OnInit
    constructor(private injector: Injector) {
        let parentComponent = this.injector.get(MyPageComponent);
        parentComponent.receiveHeaderText('String');
    }
}
person Rahul Sharma    schedule 19.07.2018
comment
Я бы посоветовал против этого. - person Roberto Zvjerković; 19.07.2018
comment
@ritaj, не могли бы вы объяснить, есть ли какие-либо плохие последствия внедрения родительского компонента в дочерний и доступа к свойствам из дочернего. Если это плохая практика, то почему? - person Anonymous; 20.07.2018
comment
@ Рахул Шарма, спасибо. Во время поиска в Google я не нашел такого способа обмена данными между родителем и ребенком (может быть, это не рекомендуется), но это решение сработало для моего сценария. Ваше решение похоже на то, что мы обращаемся к свойствам родительского компонента в дочерний компонент. Позвольте мне посмотреть, появится ли какое-то лучшее решение, если нет, я приму ваш ответ, в настоящее время я проголосовал за него. - person Anonymous; 20.07.2018