AngularJS 应用程序在 IE 中加载缓慢 - 添加进度条

2024-03-19

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


根据您所说,加载缓慢是由于 AngularJS 工作而不是数据加载所致(事实证明它在 IE 中比 Chrome 慢)。如果这是真的,那么加载指示器将无济于事,因为它也会冻结。

您最好遵循 Angular 中的正常性能技术,例如:

  • 页面显示少一点,用户肯定不需要一次看到100个字段吧?考虑分页。
  • 对于不会更改的项目,请使用一次绑定,如下所示:{{::vm.name}}
  • 关于车把,它的使用效率通常更高<div ng-bind="::vm.name"></div>而不是把手{{::vm.name}}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularJS 应用程序在 IE 中加载缓慢 - 添加进度条 的相关文章

随机推荐

  • 为什么执行sonar:sonar时找不到sonar-maven-plugin-3.0.1.jar?

    我们目前正在将 重新激活 声纳纳入我们的持续构建过程中 但我们遇到了一些问题 为了只专注于声纳 我尝试让它在 HelloWorld 项目上工作 但仍然没有成功 repo1 和 repo2 中似乎缺少一个 jar sonar maven pl
  • 启动长时间后台任务

    用户请求我网站上的某些页面 我想做的事 向用户发送快速答案并启动需要很长时间的后台任务 看起来像 public ActionResult index var task new Task Stuff start task async task
  • 删除自定义 ActionBar 中的多余空间

    我的问题涉及使用完全自定义的 ActionBar 视图 因为这对于我的客户希望 ActionBar 的工作方式是必要的 我已经删除了徽标 标题和其他所有可能的内容 但是 ActionBar 的自定义视图不会一直延伸到整个屏幕 我尝试了以下方
  • 单击图像时播放 MP3

    我想在单击网站中的某个图像时播放 MP3 文件 我还想隐藏 MP3 文件 我怎样才能做到这一点 我尝试了这段代码 但没有任何反应
  • BOT/蜘蛛陷阱创意

    我有一个客户 他的域名似乎受到 DDoS 攻击的严重打击 在日志中 看起来很正常的具有随机 IP 的用户代理 但它们翻阅页面的速度太快 不像人类 他们似乎也没有要求任何图像 我似乎找不到任何模式 我怀疑这是一群 Windows 僵尸 客户过
  • 更快地重新连接 CBPeripheral

    我正在开发一个应用程序 它可以多次连接和断开不同的蓝牙低功耗外围设备 经过在互联网上的大量研究 我没有找到一种方法来存储已经发现的服务和特征 以便我可以更快地重新连接 目前 我正在每次重新连接后发现所需的服务和特征 这花费了我 1 5 到
  • 打字稿错误 get 调用需要 0 个类型参数

    我收到打字稿错误预期 0 类型参数 但返回 get 调用的行却得到 1 我的通话有什么问题吗 public get params SummaryParams Observable
  • “OutOfMemoryException”读取 20mb XLSX 文件

    我在用着NPOI https www nuget org packages NPOI 来处理Excel文件 这是我读取文件的方式 using FileStream stream File OpenRead excelFilePath IWo
  • fill-rule="evenodd" 如何在星形 SVG 上工作

    当我试图理解时 我看到了以下 svg 形状fill rule in SVG div class contain demo div
  • 该浮点数小数部分的前 32 位是多少?

    我正在看以下内容SHA256 伪代码 http en wikipedia org wiki SHA 2 SHA 256 28a SHA 2 variant 29 pseudocode在维基百科上 具体来说 我正在查看以下部分 Initial
  • 打印文本而不是 C 枚举中的值

    int main enum Days Sunday Monday Tuesday Wednesday Thursday Friday Saturday Days TheDay int j 0 printf Please enter the
  • EF 映射对象的不兼容数据读取器异常

    我正在使用实体框架并更新了表及其存储过程 但在调用存储过程时出现以下错误 数据读取器与指定的不兼容 FormValueModel Valuation 类型的成员 ValuationId 确实 数据读取器中没有同名的相应列 Valuation
  • 如何设计一个带有需要引用自身的表的数据库?

    我正在构建一个数据库 但遇到了一个我似乎无法解决的问题 数据库比图中复杂得多 但问题可以归纳为下面的表结构 问题是每个员工都有一个经理 每个经理都是员工 看起来这些表必须互相引用 但是 当我设置它时 这似乎无法正常工作 我正在使用cakep
  • 使用单个服务器端变量处理多个复选框

    我有以下 HTML 代码
  • C#:例如集合的封装

    我想知道其中哪一个被认为是最干净或最好用的以及为什么 其中一个公开乘客列表 允许用户添加和删除等 另一个隐藏列表 只允许用户枚举它们并使用特殊方法添加 实施例1 class Bus public IEnumerable
  • Android模拟器源码在哪里

    当我几周前更新 Android Studio 时 不同组件的新版本也会自动更新 与 Android 模拟器的情况一样 我现在的版本 29 2 3 5916265 有一个错误 降级似乎非常非常困难 在最新版本的模拟器中 模拟 GPX 轨道的布
  • Interval 属性更改时 System.Timer 的行为

    我有一个 System Timer 设置 每天凌晨 2 点触发一个事件 如果计时器启动的进程失败那么我想要计时器 重置为每 15 分钟运行一次 直到该过程成功完成 this is how the timer is set up this i
  • String[] 内存使用情况

    我将字符串数组声明为 String items1 new String 5 String items2 new String 20 如果这两个数组都只包含 2 个元素 会对内存和性能产生多大影响 你可以自己测试一下 public stati
  • Spring Security - 即使凭据正确,身份验证也不起作用

    我在我的应用程序中使用 spring security 拦截一些 URL 进行身份验证 虽然网址 securemapping1 通过显示登录页面提示用户登录 但是登录不起作用 即使我提供了正确的凭据 我也会返回登录页面 凭据错误 错误通过调
  • AngularJS 应用程序在 IE 中加载缓慢 - 添加进度条

    UPDATE1 开始使用ngProgress http victorbjelkholm github io ngProgress 但在 IE 中没有给出所需的效果 最终更新 找到最佳解决方案 请参阅下面的最后一个答案 AngularJS 应