How to fix ChangeDetectorRef import error: No provider for ChangeDetectorRef
How to fix ChangeDetectorRef import error: No provider for ChangeDetectorRef
我在将 ChangeDetectorRef 导入我的组件之一时遇到问题。
供参考,家族树为 PComponent(父级)-> Options-Grid(子级)-> FComponent(孙级)。
这是我在浏览器中遇到的错误:
StaticInjectorError(AppModule)[FComponent -> ChangeDetectorRef]:
StaticInjectorError(Platform: core)[FComponent -> ChangeDetectorRef]:
NullInjectorError: No provider for ChangeDetectorRef!
错误将我带到的代码行在祖父组件 (PComponent) 中,它在其中实例化了第一个子组件 (Options-Grid)。
<div>
<options-grid></options-grid>
</div>
我在构造函数中正确提供了 ChangeDetectorRef,并在 FComponent 中正确导入了它。代码中的错误引用指向我实例化 Options-Grid 组件的 PComponent html。
这是因为我没有在父组件中提供 ChangeDetectorRef 吗?
所以我发现问题的原因是我试图在孙组件中使用 ChangeDetectorRef,这是一个禁忌。
我改为在根父组件 (PComponent) 中使用 ChangeDetectorRef,并且还为该组件实现了 ngAfterContentChecked() 方法。
这是它在 PComponent 中的最终样子:
import { Component, OnInit, ViewContainerRef, ChangeDetectorRef, AfterContentChecked } from '@angular/core';
export class PComponent implements OnInit, AfterContentChecked {
constructor(private cdr: ChangeDetectorRef){}
ngAfterContentChecked() {
this.cdr.detectChanges();
}
ngOnInit() {
....
}
}
这样子组件将忽略父组件提供者
constructor(@Optional() private ref: ChangeDetectorRef) {
this.ref = ref;
}
我在将 ChangeDetectorRef 导入我的组件之一时遇到问题。
供参考,家族树为 PComponent(父级)-> Options-Grid(子级)-> FComponent(孙级)。
这是我在浏览器中遇到的错误:
StaticInjectorError(AppModule)[FComponent -> ChangeDetectorRef]:
StaticInjectorError(Platform: core)[FComponent -> ChangeDetectorRef]:
NullInjectorError: No provider for ChangeDetectorRef!
错误将我带到的代码行在祖父组件 (PComponent) 中,它在其中实例化了第一个子组件 (Options-Grid)。
<div>
<options-grid></options-grid>
</div>
我在构造函数中正确提供了 ChangeDetectorRef,并在 FComponent 中正确导入了它。代码中的错误引用指向我实例化 Options-Grid 组件的 PComponent html。
这是因为我没有在父组件中提供 ChangeDetectorRef 吗?
所以我发现问题的原因是我试图在孙组件中使用 ChangeDetectorRef,这是一个禁忌。
我改为在根父组件 (PComponent) 中使用 ChangeDetectorRef,并且还为该组件实现了 ngAfterContentChecked() 方法。
这是它在 PComponent 中的最终样子:
import { Component, OnInit, ViewContainerRef, ChangeDetectorRef, AfterContentChecked } from '@angular/core';
export class PComponent implements OnInit, AfterContentChecked {
constructor(private cdr: ChangeDetectorRef){}
ngAfterContentChecked() {
this.cdr.detectChanges();
}
ngOnInit() {
....
}
}
这样子组件将忽略父组件提供者
constructor(@Optional() private ref: ChangeDetectorRef) {
this.ref = ref;
}