angular: [Ivy] ASSERTION ERROR: Should be run in update mode
🐞 bug report
Affected Package
The issue is caused by package @angular/core (Ivy)Is this a regression?
Yes, works in non-Ivy.
Description
I suspect this happens as a result of having an Input property that is set directly (isExpanded="true"
) instead of using a binding ([isExpanded]="true"
), and having the property setter call changeDetectorRef.detectChanges()
. It should be noted that this works in non-ivy.
🔬 Minimal Reproduction
https://github.com/fr0/angular-test/tree/ivy
- Clone repo
git checkout ivy
npm install
npm start
- Open http://localhost:4200 in Chrome
- View browser console log
🔥 Exception or Error
core.js:5829 ERROR Error: ASSERTION ERROR: Should be run in update mode
at throwError (core.js:1164)
at assertEqual (core.js:1123)
at refreshView (core.js:12425)
at detectChangesInternal (core.js:13907)
at ViewRef.detectChanges (core.js:15373)
at ExpandableIfComponent.set isExpanded [as isExpanded] (expandable-if.component.ts:60)
at setInputsFromAttrs (core.js:13579)
at postProcessDirective (core.js:13335)
at instantiateAllDirectives (core.js:13234)
at createDirectivesInstances (core.js:12618)
🌍 Your Environment
Angular Version:
Angular CLI: 9.0.0-next.5
Node: 12.6.0
OS: darwin x64
Angular: 9.0.0-next.7
... animations, common, compiler, compiler-cli, core, forms
... language-service, platform-browser, platform-browser-dynamic
... router
Package Version
-----------------------------------------------------------
@angular-devkit/architect 0.900.0-next.5
@angular-devkit/build-angular 0.900.0-next.5
@angular-devkit/build-optimizer 0.900.0-next.5
@angular-devkit/build-webpack 0.900.0-next.5
@angular-devkit/core 9.0.0-next.5
@angular-devkit/schematics 9.0.0-next.5
@angular/cli 9.0.0-next.5
@ngtools/webpack 9.0.0-next.5
@schematics/angular 9.0.0-next.5
@schematics/update 0.900.0-next.5
ng-packagr 5.5.1
rxjs 6.5.3
typescript 3.5.3
webpack 4.40.2
About this issue
- Original URL
- State: open
- Created 5 years ago
- Reactions: 18
- Comments: 33 (5 by maintainers)
Commits related to this issue
- fix runtime assertion error https://github.com/angular/angular/issues/32756#issuecomment-629711119 — committed to michalakadam/perfect_house by michalakadam 3 years ago
oh, the same issue (angular 9.1.7 with { ngZone: ‘noop’ })
resolved it by moving logic out of constructor to ngOnInit
@BzenkoSergey It worked! You are a champ!
Looked through my company’s project for ALL logic defined in components constructors, and moved anything I found to ngOnInit, and bam, no error.
Temporary fix for me: replace call
detectChanges()
tomarkForCheck()
.same problem. any updates?
Please provide minimal reproduction with exact steps on how to reproduce it. We have limited time and can’t go explore your application.
I use setTimeout(() => this.changeDetector.detectChanges(), 0);
A typical scenario, where this error occurs is something along those lines:
Basically we are invoking an input setter in the creation mode (this might happen if an input is set from a static attribute). 2 possible solutions here:
In Angular 12 this is happening even when not in a constructor. Simply calling .detectChanges() in an observable that, I don’t know…initially runs too early and fast?, throws this error. Constructor has nothing in the body.
This error appeared when I was calling detectChanges() in the constructor after subscribing to some data. I moved the subscription and detectChanges() to ngOnInit() instead and it disappeared.
I believe this is bad practice to have some logic within constructor in any case. But yeah, worked for me.
PR is still open https://github.com/angular/angular/pull/33463
This breaks a big chunk of our application, any updates on this issue?
Same issue here. I experienced the issue using
this.changeDetectorRef.detectChanges()
in a sync operation.Some background: I’m building an Electron Application using Angular 9.0.6 + Electron 8 + @angular-guru/electron-builder (as builder)
Using the code below triggers the error:
Removing that line, or changing to as below, solved my problem:
Hope this could be helpful for someone. My environment: