Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ExpressionChangedAfterItHasBeenCheckedError with ngClass

I have two anchor tags

 <ul class="switchNav">
          <li [ngClass]="!hidePanel2 ? 'active' : ''">
            <a href="javascript:void(0)" (click) ="hideShowPanel(1)">panel 1</a>
          </li>
          <li [ngClass]="!hidePanel1? 'active' : ''">
            <a href="javascript:void(0)" (click) ="hideShowPanel(2)">panel 2</a>
          </li>
        </ul>

.ts

hidePanel2: boolean  = true;
 hidePanel1: boolean  = false;

 hideShowPanel(check: number) {
    if (check == 1) {
      this.hidePanel2 = true;
      this.hidePanel1 = false;
    }
    else {
      this.hidePanel1 = false;
      this.hidePanel2 = true;
    }

  }

When I click on anchor tag it throws an error

ExpressionChangedAfterItHasBeenCheckedError

It was working,but due to update any module by a team member it stopped working,

I have googled a lot but could not get it working

Please help

Thanks

like image 803
Md. Parvez Alam Avatar asked Sep 24 '18 07:09

Md. Parvez Alam


People also ask

Can I use both class and ngClass?

You can use both class and ngClass as the first one gives you the opportunity to apply a class that you want to implement in all cases under any circumstances and the later to apply classes conditionally.

How do you resolve ExpressionChangedAfterItHasBeenCheckedError?

A good way to fix the ExpressionChangedAfterItHasBeenCheckedError is to make Angular aware of the fact that you have changed the code after it has completed its first check. You can do this by using setTimeout to make the error go away.


1 Answers

To add to Ritesh's answer, in this case you can do two things :

  • wrap the code that causes this message in a setTimeout() callback
  • Tell Angular to make another detection loops like this :

--

 constructor(private changeDetector: ChangeDetectorRef) {
 }

 hideShowPanel(check: number) {
 
    if (check == 1) {
        this.hidePanel2 = true;
        this.hidePanel1 = false;
    }
    else {
        this.hidePanel1 = false;
        this.hidePanel2 = true;
    }
    this.changeDetector.detectChanges();
}

I would also like to suggest an interesting article that explains what happens under the hood : Everything you need to know about ExpressionChangedAfterItHasBeenCheckedError

like image 142
Pac0 Avatar answered Dec 06 '22 14:12

Pac0