Angular ngFor 生命周期
Angular ngFor lifecycle
我正在使用 *ngFor
迭代一些这样的数据:
<div *ngFor="let d of [1, 2, 3]"> {{d}} </div>
一切正常,我得到了预期的结果:
<div> 1 </div>
<div> 2 </div>
<div> 3 </div>
然后,我想是不是用函数代替了{{d}}
,于是写了一个函数:
protected logAndReturn(item) {
console.log(item);
return item;
}
我用过它:
<div *ngFor="let d of [1, 2, 3]"> {{logAndReturn(d)}} </div>
我得到了与第一个代码相同的呈现 HTML 结果,但控制台输出不是我预期的输出。
控制台输出:
1
2
3
1
2
3
Angular is running in the development mode. Call enableProdMode() to enable the production mode.
1
2
3
1
2
3
添加的函数现在被调用了 12 次(每个项目 4 次)
这里是你可以自己测试的代码:jsfiddle
我的代码有错吗?有什么解决方案可以防止这些额外的电话吗?为什么会发生这种情况,谁能解释一下?
此问题与*ngFor
无关,是expression
内插({{ }})
的正常现象。 angular 故意多次调用它来检查 expression
是否已更改。插值用于获取(打印)expressions
,不推荐用于调用 methods
。它会不必要地开火。
在视图中使用方法与使用非纯管道相同。这段代码将在视图上的每个事件中执行,可能会执行很多次。在我们的示例中,logAndReturn()
方法仅 returns 一个数字,因此可以假设它在视图中 运行 它但是如果它会做一些更复杂的事情,它可能是一个大问题表现。使用一个简单的程序,您可以检查 console.log 以查看在哪一步打印了“logAndReturn”的踪迹。这是新组件的外观:
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'
}
(...)
}
要深入了解这里真正发生的事情,请阅读 Angular2 关于 life cycle
的官方文档
我正在使用 *ngFor
迭代一些这样的数据:
<div *ngFor="let d of [1, 2, 3]"> {{d}} </div>
一切正常,我得到了预期的结果:
<div> 1 </div>
<div> 2 </div>
<div> 3 </div>
然后,我想是不是用函数代替了{{d}}
,于是写了一个函数:
protected logAndReturn(item) {
console.log(item);
return item;
}
我用过它:
<div *ngFor="let d of [1, 2, 3]"> {{logAndReturn(d)}} </div>
我得到了与第一个代码相同的呈现 HTML 结果,但控制台输出不是我预期的输出。 控制台输出:
1
2
3
1
2
3
Angular is running in the development mode. Call enableProdMode() to enable the production mode.
1
2
3
1
2
3
添加的函数现在被调用了 12 次(每个项目 4 次)
这里是你可以自己测试的代码:jsfiddle
我的代码有错吗?有什么解决方案可以防止这些额外的电话吗?为什么会发生这种情况,谁能解释一下?
此问题与*ngFor
无关,是expression
内插({{ }})
的正常现象。 angular 故意多次调用它来检查 expression
是否已更改。插值用于获取(打印)expressions
,不推荐用于调用 methods
。它会不必要地开火。
在视图中使用方法与使用非纯管道相同。这段代码将在视图上的每个事件中执行,可能会执行很多次。在我们的示例中,logAndReturn()
方法仅 returns 一个数字,因此可以假设它在视图中 运行 它但是如果它会做一些更复杂的事情,它可能是一个大问题表现。使用一个简单的程序,您可以检查 console.log 以查看在哪一步打印了“logAndReturn”的踪迹。这是新组件的外观:
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'
}
(...)
}
要深入了解这里真正发生的事情,请阅读 Angular2 关于 life cycle
的官方文档