How to set the default change detection strategy to OnPush
? Can it be set globally somehow?
I want to avoid having to adding this line to every component
@Component({
...
changeDetection: ChangeDetectionStrategy.OnPush,
...
})
How to set the default change detection strategy to OnPush
? Can it be set globally somehow?
I want to avoid having to adding this line to every component
@Component({
...
changeDetection: ChangeDetectionStrategy.OnPush,
...
})
It is possible to set the change detection strategy to OnPush in the CLI so that newly generated components will have it set like that.
ng generate component test --changeDetection=OnPush
You can also set that value as default in your angular.json, so that you don't need to set the flag every time:
// angular.json
{
//...
"schematics": {
"@schematics/angular": {
"component": {
"changeDetection": "OnPush"
}
}
}
}
The change detection strategy can only be defined per component or directive not globally.
Using a custom decorator is discouraged because it will not be supported by the upcoming offline template compiler.
You don't want it to be set globally.
OnPush
will never allow change detection to pass unless
lViewFlags.dirty
Having OnPush
on all components is dangerous unless you really know how Change Detection works.
In short:
lViewFlags.dirty
lViewFlags.dirty
markForCheck()
wil mark the view and its parents as lViewFlags.dirty
So basically every time something happens the view and its parents is dirty anyway, so there is no performance gain of adding OnPush
on top-level components.
I explained it in detail in this article: https://blog.simplified.courses/angular-change-detection-onpush-or-not/