Skip to content

Instantly share code, notes, and snippets.

@vades
Last active April 5, 2024 11:17
Show Gist options
  • Star 21 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save vades/a225170304f34f88a7a5d48bf4b1f58c to your computer and use it in GitHub Desktop.
Save vades/a225170304f34f88a7a5d48bf4b1f58c to your computer and use it in GitHub Desktop.
Fixing "Expression has changed after it was checked" in Angular

Fixing "Expression has changed after it was checked" in Angular

The exception appears (in the development mode) at the moment the value is checked and value is different of the updated value.

Error message example

AppComponent.html:1 ERROR Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'ngIf: true'. Current value: 'ngIf: false'.
    at viewDebugError (core.js:20440)
    at expressionChangedAfterItHasBeenCheckedError (core.js:20428)
    at checkBindingNoChanges (core.js:20530)
    at checkNoChangesNodeInline (core.js:23401)
    ...

Solution

In your component import ChangeDetectorRef, AfterContentChecked

import { Component, OnInit, ChangeDetectorRef, AfterContentChecked } from '@angular/core';

Add ngAfterContentChecked()

 ngAfterContentChecked(): void {
    this.changeDetector.detectChanges();
  }

Component example

src\app\app.component.ts

import { Component, OnInit, ChangeDetectorRef, AfterContentChecked } from '@angular/core';
import { Title } from '@angular/platform-browser';

import { environment } from '@env/environment';
import { LayoutService } from '@app/core/layout/layout.service';


@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: []
})
export class AppComponent implements OnInit, AfterContentChecked {
  env = environment;
  title = this.env.appName;
  partials: any = {};

  public constructor(
    private titleService: Title,
    public layout: LayoutService,
    private changeDetector: ChangeDetectorRef,
  ) {}

   ngOnInit() {
    this.titleService.setTitle(this.env.appName);
    
    this.layout.getLayout().subscribe(partials => {
      this.partials = partials;
    });
  }

  ngAfterContentChecked(): void {
    this.changeDetector.detectChanges();
  }
}
@musicmunky
Copy link

Still saving lives over two years after the original post - thank you so much!!

@kevindqc
Copy link

Doesn't this just gets rid of the error by always running the change detection twice, while doing nothing about the underlying problem?

@spock123
Copy link

Generally this comes if you changes or modify variables that the template is listening to, in your component constructor.

Instead use the AfterViewInit method

@EricNeves
Copy link

Amazing, thanks bro!

@Bagestan
Copy link

Amazing!, thank you!!!

@david-ae
Copy link

Thank you!!!!!

@NarumataSelvaraj
Copy link

Thank you!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment