我一直在玩 AngularJS 1.x 和 Angular 2,试图比较它们的性能。
这是一个Plunkr ,它显示了 Angular 1.x 的“缺点”。如果作用域上存在太多元素,您会注意到在编辑输入字段时呈现滞后,因为框架每次检测到可能已更改的事件时都会检查作用域上的所有元素。
摘自第一个 Plunkr (html):
<body ng-app="myApp">
<div ng-controller="myCtrl">
<input ng-model ="name"></input>
Hello, {{name}}!
<button ng-click="generateFields()">
Generate 5000 elements
</button>
{{list}}
</div>
摘自第一个 Plunkr (js):
myApp.controller('myCtrl', function($scope) {
$scope.name = 'name';
$scope.list = [];
$scope.generateFields = function(){
for(i=0; i<5000;i++){
$scope.list.push(i);
}
}
});
在这个Plunkr中,我在 Angular 2 中编写了一个类似的示例。似乎根本没有滞后。这在 Angular 2 中是如何解决的?框架是否以某种方式知道只有输入字段发生了更改,还是因为 VM 优化的更改检测器而在执行脏检查时更快?
摘自第二个 Plunkr:
@Component({
selector: 'my-app',
providers: [],
template: `
<div>
<div>{{myProp}}</div>
<input [(ngModel)]="myProp" />
<button (click)="generateFields()">Generate</button>
<div>{{myList}}</div>
</div>
`,
directives: []
})
export class App {
constructor() {
}
myProp :string = "Change me!";
myList :any = [];
generateFields(){
for (var i = 1; i < 5000; i++)
{
this.myList.push(i);
}
console.log("fields generated");
}
}