【问题标题】:ngOnChanges not triggered though I called ChangeDetectorRef.detectChanges尽管我调用了 ChangeDetectorRef.detectChanges,但未触发 ngOnChanges
【发布时间】:2020-11-19 03:34:57
【问题描述】:
export class AppComponent implements OnInit, OnChanges {
  @Input()
  value: number;

  constructor(
    private cdr: ChangeDetectorRef
  ) {}

  ngOnInit() {
    of(1).subscribe(v => {
        this.value = v;

        console.log(1);

        this.cdr.detectChanges();

        of(2).subscribe(() => {
          console.log(2);
        });
      })
  }

  ngOnChanges(c: SimpleChanges) {
    console.log(3);
  }
}

我预计 console.log 的序列应该是 1, 3, 2,但它只打印 1, 2

我知道ngOnChanges 只会在只有input 更改来自模板绑定时才会触发。

所以我在console.log(1) 之后立即打电话给this.cdr.detectChanges(),但没有成功。

这里有什么问题?

我在这里制作了 stackblitz 示例 - https://stackblitz.com/edit/angular-ivy-ugdba1

额外问题

如果在组件内部无法触发ngOnChangesthis.cdr.detectChanges()会触发哪些生命周期钩子?

【问题讨论】:

  • 如果你真的想触发ngOnChanges(),你可以打电话给this.ngOnChanges()。这并不优雅,但我想说尝试通过任何其他方式手动触发钩子也不是。
  • 好的,所以不可能自动触发..
  • 我不知道这种方法。
  • 你能检查我的额外问题吗?

标签: angular ngonchanges change-detector-ref


【解决方案1】:

ngOnChanges 在从父组件更改输入参数时被调用。

如果你想在任何检测后做某事,你应该使用ngAfterViewChecked()

【讨论】:

  • 但如果我打电话给detectChanges,它应该被调用?
  • 否...仅当参数更改时
  • 有什么方法可以从我的组件触发 ngOnChanges?
  • ngOnChanges 中的代码包装在另一个函数中并调用该函数而不是 this.cdr.detectChanges()
  • 我的目的是触发组件内部的 ngOnChanges,如果不可能,请告诉我
【解决方案2】:

this.cdr.detectChages() 调用当前组件模板上的更改检测。这意味着如果当前组件包含<child [data]="someData"></child>,那么将检查其[data] 输入是否有更改。 child.ngDoCheck() 将被调用,如果 someData 是新值 child.ngOnChanges(...) 将被调用。

【讨论】:

  • 那么如何触发ngOnChanges呢?
  • 钩子并不是由开发者“触发”的。如果你想要它,你可以打电话给它,只要做this.ngOnChanges({})
猜你喜欢
  • 2014-06-21
  • 2021-11-27
  • 2017-09-25
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 2017-09-18
相关资源
最近更新 更多