【问题标题】:Angular-5 how to get data from multiple children to parent using single event?Angular-5如何使用单个事件从多个孩子获取数据到父母?
【发布时间】:2018-07-19 14:33:01
【问题描述】:

我有一个场景,我的网页中有 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。 但是我的选项卡组件中的侦听器函数永远不会被调用。 谁能指导我哪里出错了? 任何更好的方法来实现同样的目标。 提前致谢。

【问题讨论】:

  • 简短的回答是您不能通过router-outlet 上的绑定传递数据。 stackoverflow.com/questions/41451375/… 虽然这个问题与输入数据有关,但对于输出数据也是如此。您可能需要共享服务来解决此问题

标签: angular angular-event-emitter


【解决方案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');
    }
}

【讨论】:

  • 我建议不要这样做。
  • @ritaj,您能否解释一下将父组件注入子组件并从子组件访问属性是否有任何不良后果。如果这是不好的做法,那为什么会这样呢?
  • @Rahul Sharma,谢谢。在谷歌搜索时,我没有发现这种在父母和孩子之间共享数据的方式(可能不推荐),但这个解决方案适用于我的场景。您的解决方案就像我们正在将父组件属性访问到子组件中。让我看看是否有更好的解决方案,如果没有,我会接受你的答案,目前我已经投票了。
猜你喜欢
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 2011-05-23
  • 1970-01-01
  • 2018-09-22
相关资源
最近更新 更多