在父级的 ngOnDestroy 之后未调用 Angular ngOnChanges

Posted

技术标签:

【中文标题】在父级的 ngOnDestroy 之后未调用 Angular ngOnChanges【英文标题】:Angular ngOnChanges not called after ngOnDestroy of parent 【发布时间】:2020-04-02 11:11:53 【问题描述】:

我有一个接受输入的子组件

<app-custom [customModel]="customModel"></app-custom>

在子组件中,我通过执行以下操作检测到 customModel 输入的更改:

@Input() customModel: CustomModel;

ngOnChanges(changes: SimpleChanges) 
  console.log('changes', changes); // -> does not get called from ngOnDestroy of parent 

在我的父组件中,我想在父组件被销毁时通知子组件

customModel = null;

ngOnDestroy() 
  let obj = new CustomModel();
  obj.state = 0;
  this.customModel = obj;

当父组件的ngOnDestroy中输入customModel发生变化时,不会调用子组件的ngOnChanges。为什么会发生这种情况?

我在孩子中有一个音频元素,即使在父级被销毁后仍然可以听到音频。

在其他情况下,当我更改输入时调用 ngOnChanges,但不是通过 ngOnDestroy

【问题讨论】:

如果父母死了,孩子也死了,因此父母 - 孩子的关系。可以通过 ViewChild 引用子组件,然后在 ngOnDestroy 中调用父组件的方法 @Dino 我可以在父母中有多个这样的孩子,那我该怎么做? 【参考方案1】:

我认为是因为子组件在其父组件之前被销毁。 您可以通过两个组件的 ngOnDestroy() 方法中的简单日志来检查这一点。

更新

因此,如果您想停止当前正在运行的音频,只需在子组件被销毁时执行它即可。

【讨论】:

当您更改 ngOnDestroy() 父方法中的 customModel 输入时,子组件甚至不存在,因此无法处理。 那么在这种情况下如何将数据传递给子组件呢?我在孩子中有一个音频元素,即使在父母被破坏后音频仍在播放 告诉我们更多关于您的要求 我在子组件中有一个音频元素。当父组件被销毁时,仍然可以听到来自子组件的音频 你可以在 ngOnDestroy() 子方法中处理这个

以上是关于在父级的 ngOnDestroy 之后未调用 Angular ngOnChanges的主要内容,如果未能解决你的问题,请参考以下文章

Jquery常用代码

在iframe窗体内 获取父级的元素;;在父窗口中获取iframe中的元素

css父级没包住子级是怎么回事,我用firebug查看,确实在父级的div中,但是就是没有包括子级的内容

Angular 和 SwiperJS - 在父滑块索引更改时重置嵌套滑块索引

RecyclerView 内容未使用片段父级的全宽

jQuery Mobile 停止对父级的点击传播