I happened to see ChangeDetectionStrategy
in the ngrx documentation. It uses OnPush
.
What is ChangeDetectionStrategy
in Angular2, and when to use OnPush Vs Default?
The main idea behind the OnPush strategy manifests from the realization that if we treat reference types as immutable objects, we can detect if a value has changed much faster. When a reference type is immutable, this means every time it is updated, the reference on the stack memory will have to change.
Start with bottlenecks. But even if your app does not struggle with performance, checking every view on every event is a huge waste. So I advise everybody to always use the OnPush strategy.
As an Angular developer, sometimes we might be curious about how Angular detects changes in the data (model) and then renders them to the view. This is called Angular Change Detection Strategy.
Angular Change Detection Strategy are the methods by which the updates to the component is tracked and component is triggered to Re-render. There are majorly 2 Change Detection Strategy in Angular. We can configure the Change Detection Strategy for the Component inside the Decorator.
All above answers explain OnPush
and Default
, here I post an example about how it really works:
https://plnkr.co/edit/hBYb5VOrZYEsnzJQF5Hk?p=preview
user-one.component.ts :
import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
@Component({
selector: 'user-one',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<div>
<h4>{{ user.name }}</h4>
<h5>{{ user.age }} years old</h5>
{{ user.location }} <br />
{{ user.email }}
<button (click)="update()">Internal update</button>
<p>* should not update</p>
</div>
`
})
export class UserOneComponent {
@Input()
user;
update() {
this.user.name = 'Lebron James';
}
}
user-two.component.ts :
import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
@Component({
selector: 'user-two',
changeDetection: ChangeDetectionStrategy.Default,
template: `
<div>
<h4>{{ user.name }}</h4>
<h5>{{ user.age }} years old</h5>
{{ user.location }} <br />
{{ user.email }}
<button (click)="update()">Internal update</button>
<p>* should update</p>
</div>
`
})
export class UserTwoComponent {
@Input()
user;
update() {
this.user.name = 'Kevin Durant';
}
}
Every time we change object properties like 'this.user.email' or 'this.user.name', UserTwoComponent would always update the changes but UserOneComponent only change when we have a new user object.
If you change the properties inside of each component, it inherit the ChangeDectectionStrategy, for instance, if we change this.user.name inside UserOneComponent both names in UserOneComponent and UserTwoComponent would change, but if we change name inside UserTwoComponent, only name inside UserTwoComponent would change
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With