ngOnInit 在 Angular 的组件内初始化 EventEmitter 变量是不是为时已晚?

Posted

技术标签:

【中文标题】ngOnInit 在 Angular 的组件内初始化 EventEmitter 变量是不是为时已晚?【英文标题】:Is ngOnInit too late to initialise an EventEmitter var inside a component in Angular?ngOnInit 在 Angular 的组件内初始化 EventEmitter 变量是否为时已晚? 【发布时间】:2020-11-05 03:00:08 【问题描述】:

我尝试了以下子组件类

@Component(
  selector: 'child',
  templateUrl: './child.component.html'
)
export class Child implements OnInit 
  @Output() send: EventEmitter<string>;
  public constructor()
  public ngOnInit() 
    send = new EventEmitter<string>();
  
  public onEventXYZ() 
    this.send.emit('hello');
  

在父模板中,我将上述组件引用为

<child (send)="handleSend($event)"></child>

导致此错误:Cannot read property 'subscribe' of undefined... 页面加载。后来我在朋友的建议下,将 EventEmitter 初始化从 ngOnInit 移到了构造函数中,一切正常。

那么,在 ngOnInit 中初始化组件变量是否为时已晚?

【问题讨论】:

【参考方案1】:

我相信您正在订阅父组件中收到的事件。当您在模板中使用事件绑定签名 ((send)="handleSend($event)") 时,您不必显式订阅事件。

试试下面的

parent.component.html

<child (send)="handleSend($event)"></child>

parent.component.ts

handleSend(event: any) 
  console.log(event);
  // no subscription is needed here

至于EventEmitter 初始化,您可以在定义行中进行。不影响代码。

child.component.ts

export class Child implements OnInit 
  @Output() send: EventEmitter<string> = new EventEmitter<string>();
  public constructor()

【讨论】:

Michael D,我知道它也适用于内联定义,但我想知道,为什么在 ngOnInit 中初始化 EventEmitter 类型 var 为时已晚? @oomer:这取决于您何时在send 变量上调用emitngOnChanges 挂钩在 ngOnInit 之前触发。因此,如果您要在ngOnChanges 中发出某些内容,您将得到未定义的错误。像我展示的那样在定义中初始化它没有错。

以上是关于ngOnInit 在 Angular 的组件内初始化 EventEmitter 变量是不是为时已晚?的主要内容,如果未能解决你的问题,请参考以下文章

我应该在其构造函数中还是在 app.component 的 ngOnInit 方法中初始化 Angular 服务?

angular 中组件的生命周期函数

组件 ngOnInit 中的 Angular 订阅

Angular2 - 在组件中测试 ngOninit

Angular 依赖注入和数据初始化

在 Angular 4 中更新服务数据