【发布时间】:2016-10-07 20:19:51
【问题描述】:
在 Angular 1 中,我们避免过多地从模板表达式中调用函数,例如ng-repeat="item in vm.getFilteredItems()" 因为与 getFilteredItems 的结果无关的属性更改会导致函数在摘要上重复且不必要地重新计算,这通常会导致大规模的性能问题。相反,我们绑定到对象,并根据事件进行计算(例如ng-repeat="item in vm.filteredItems)。
在 Angular 2 中,脏检查过程已经过优化,但组件模板中调用的函数仍然会在组件级别的任何属性发生更改时被调用,无论该函数是否依赖于这些属性。如果使用不当,我预计这可能会导致相同的性能问题。
这是 Angular 2 中不同方法的简化示例:
// function binding in template
@Component({
selector: 'func',
template: `
<input [(ngModel)]="searchTerm" placeholder="searchTerm" />
<div *ngFor="let name of filteredNames(searchTerm)">{{name}}</div>
`
})
export class FuncComponent {
@Input() names:string[];
filteredNames(searchTerm) {
if (!searchTerm) return this.names;
let filteredNames = [];
return this.names.filter((name) => {
return name.toLowerCase().indexOf(searchTerm.toLowerCase()) > -1;
});
}
}
-
// no function binding
@Component({
selector: 'nofunc',
template: `
<input [(ngModel)]="searchTerm" (ngModelChange)="search($event)" placeholder="searchTerm" />
<div *ngFor="let name of filteredNames">{{name}}</div>
`
})
export class NoFuncComponent implements OnInit {
@Input() names:string[];
searchTerm: string;
ngOnInit() {
this.search(this.searchTerm);
}
search() {
if (!this.searchTerm) {
this.filteredNames = this.names;
return;
}
this.filteredNames = this.names.filter((name) => {
return name.toLowerCase().indexOf(this.searchTerm.toLowerCase()) > -1;
});
}
}
http://plnkr.co/edit/AAFknlJgso3D8F1w3QC1?p=preview
在 Angular 2 中这仍然是一个问题吗?首选哪种方法,为什么?谢谢!
【问题讨论】: