I\'m using *ngFor
to iterate some data like this:
{{d}}
Everything is fine
using methods in the view is the same that using impure pipes. This code will be executed in each event on the view, which can be a lot of times. In our example, the logAndReturn()
method only returns a number so it can be assumable to run it in a view but if it would do something more complex, it could be a big problem of performance. with a simple program you can check console.log to see in which step the trace of “logAndReturn” is printed. This is the look of the new component:
export class AppComponent implements
OnChanges,
OnInit,
DoCheck,
AfterContentInit,
AfterContentChecked,
AfterViewInit,
AfterViewChecked,
OnDestroy
{
private var01: string = "default value";
constructor( private trans: TranslatorService ){}
ngOnChanges (){
console.log('Trace OnChanges');
}
ngOnInit (){
console.log('Trace onInit');
}
ngDoCheck (){
console.log('Trace doCheck');
}
ngAfterContentInit(){
console.log('Trace After Content Init');
}
ngAfterContentChecked(){
console.log('Trace after contente checked');
}
ngAfterViewInit(){
console.log('Trace after view init');
}
ngAfterViewChecked(){
console.log('Trace after view checked');
}
ngOnDestroy(){
console.log('Trace on destroy');
}
testRender() {
console.log('trace 01');
return 'This is a test that runs a console log'
}
(...)
}
To go deeper in what really is happening here, read the official documentation of Angular 2 about the life cycle
This issue has no relation with *ngFor
, It's the normal behavior of the expression
inside the interpolation ({{ }})
. It is called by angular intentionally multiple times to check if the expression
has changed. Interpolation is meant for fetching (printing) expressions
and not recomended for calling methods
. It will fire unnecessarily.
Issue is with the method inside interploation not *ngFor