UPDATE1:开始使用ngProgress http://victorbjelkholm.github.io/ngProgress/,但在 IE 中没有给出所需的效果。
最终更新:找到最佳解决方案。请参阅下面的最后一个答案。
AngularJS 应用程序有多个选项卡,每个选项卡最多可以有 100 个字段。使用多个 Ajax 调用从数据库检索数据,并使用相关循环来初始化以下各项:验证规则、下拉列表项以及最后的字段值。在某些情况下,我们使用Javascript和AngularJS结合的方式来获得所需的效果。
请注意,验证规则的加载涉及修改指令,例如ng-required
and ng-max
这将需要使用$compile
激活验证规则。
这个问题有两个部分:
- AngularJS App 在 IE 下有明显的加载缓慢效果。在Chrome浏览器下,加载速度要好得多。
如何排查和分析IE浏览器加载缓慢的问题,从而定位问题所在?如何在IE下使用性能分析工具?
- 同时,考虑添加进度条,在完成加载上述每个数据部分后更新:验证规则、下拉列表项和字段值。
我在我的项目中实现了 ngProgress 插件,它在 Chrome 下工作正常,但在 IE 下它没有给出所需的效果。进度条将在页面加载最后显示并完成。在IE下,页面渲染开始时进度条似乎不会立即显示。请注意,在我的项目中,我广泛使用指令,并且其中大量使用$compile
服务。
我做了一些研究,发现 IE 不会立即更新 DOM 显示......它会等到后期才一次性更新,或者至少这是我的理解。所以这里的技巧就是如何强制IE尽快反映DOM的变化。
我使用这种方法有助于在 IE 下获得更好的结果:
app.controller('formMainController', ['$scope', '$timeout', '$interval', 'ngProgressFactory',
function($scope, $timeout, $interval, $q, ngDialog, ngProgressFactory) {
$scope.progressbar = ngProgressFactory.createInstance();
$scope.progressbar.start();
$scope.stopProgressbar = $interval(function(){
$scope.progressbar.setParent(document.getElementsByTagName("BODY")[0]);
},10);
...
...
//After getting all data from DB
$scope.mainPromise.then(function(success) {
$interval.cancel($scope.stopProgressbar);
$timeout(function(){
$scope.progressbar.complete();
}, 3000);
return 'main promise done';
})
}]);
有了上面的内容,在IE下,我可以看到进度条比以前显示得早得多,然后它会进行2步进度,然后会冻结大约2秒,然后正常继续。当观察控制台窗口时,我可以看到它会冻结,而其他许多指令正在执行,尤其是使用的指令$compile
服务与priority: 100
and terminal: true,
.
知道如何让它变得更好吗?
Note: 这个线程 https://stackoverflow.com/questions/15183095/angularjs-really-slow-at-rendering-with-about-2000-elements有类似的问题,但我没有找到相关的解决方案。
Tarek