Angular 表达式ChangedTerithasBeenCheckedError未定义的输入参数

Angular 表达式ChangedTerithasBeenCheckedError未定义的输入参数,angular,Angular,绕圈子讨论如何解决这个问题。阅读到处突出显示的两个博客。理解原因,但不管我尝试什么,这个错误不会消失。错误与输入参数有关。当组件加载时,它是未定义的,然后获得正确的值 我试过使用: 子组件中的各种生命周期挂钩没有运气-ngOnit ngAfterViewChecked、ngAfterViewInit等 尝试使用计时器 尝试在子组件中使用ChangeDetectorRef 尝试使用*ngIf=“ComponentName” EventEmitter设置为true以允许异步 我仍然得到错误。有人

绕圈子讨论如何解决这个问题。阅读到处突出显示的两个博客。理解原因,但不管我尝试什么,这个错误不会消失。错误与输入参数有关。当组件加载时,它是未定义的,然后获得正确的值

我试过使用:

  • 子组件中的各种生命周期挂钩没有运气-ngOnit
  • ngAfterViewChecked、ngAfterViewInit等
  • 尝试使用计时器
  • 尝试在子组件中使用ChangeDetectorRef
  • 尝试使用*ngIf=“ComponentName”
  • EventEmitter设置为true以允许异步
我仍然得到错误。有人能看看我做错了什么吗

错误消息

Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'AreaName: undefined'. Current value: 'AreaName: dashboard'. It seems like the view has been created after its parent and its children have been dirty checked. Has it been created in a change detection hook ?
父组件ts文件。

export class Dashboard {
  public ComponentName: string = "dashboard";
  private showContent: boolean = false;

  constructor() {}

  public displayMethod(): void {}

  public CanAccess(canAccess : boolean) : boolean {
    return this.showContent = canAccess;
  }
}
父组件Html

<div class="content-area" >
   <h3>This is dashboard information</h3> 
</div>

<no-access [AreaName]="ComponentName" (AllowedAccess)="CanAccess($event)"></no-access> 

这是仪表板信息
子组件ts

export class NoAccess implements OnInit {

    @Input() AreaName: string;
    @Output() AllowedAccess = new EventEmitter<boolean>(true);
    public showSubContent: boolean;

    constructor(private authService : AuthenticationService) {}

    ngOnInit(): void {
      setTimeout(() => {
        this.showSubContent = this.authService.CanRead(this.AreaName, null);
        this.AllowedAccess.emit(false);
      });
    }
  }
导出类NoAccess实现OnInit{
@输入()区域名称:字符串;
@Output()AllowedAccess=新的EventEmitter(true);
公共ShowSubcent:布尔值;
构造函数(私有authService:AuthenticationService){}
ngOnInit():void{
设置超时(()=>{
this.showsubcent=this.authService.CanRead(this.AreaName,null);
this.AllowedAccess.emit(false);
});
}
}
试试这个:

export class Dashboard {
  public ComponentName: string = "dashboard";
  private showContent: boolean = false;

  constructor(private cd: ChangeDetectorRef) {
  }

  ngAfterViewInit() {
      this.cd.detectChanges();
  }

  public displayMethod(): void {}

  public CanAccess(canAccess : boolean) : boolean {
    return this.showContent = canAccess;
  }
}

如本文所述,imho不是最好的解决方案,但它应该可以工作。

看起来子组件是在父组件之前创建的。NoAccess组件是否在其他地方使用?不,这是第一个实例,但它将在其他地方使用。如果您可以组织一次StackBlitz或其他演示此问题的内容,这将非常有用。我使用您发布的源代码整理了这一个,它似乎运行良好:不幸的是,这不起作用,我仍然得到相同的错误。我确实读过那篇博文。