如何在 AngularJS 中检测 HTML 渲染何时完成

2023-12-09

我对这个课题进行了广泛的研究,但无论我做什么,我发现实现这个目标都极其困难。

我想在 AngularJS Web 应用程序中完全呈现所有元素时执行代码。我想我找到了建议使用路由器和视图的解决方案,但我无法在我的情况下使用它,因为它似乎需要某些配置。

当你有ng-repeat和很多嵌套的directives将根据各种条件生成 HTML/内容ng-if,我注意到即使在文档就绪事件被触发或视图内容已加载后,HTML 渲染仍会继续,即$viewContentLoaded事件被触发。

我最接近的想法是使用$watch超过给定元素的子元素的长度directive。每次$watch执行完毕,计数器递增renderCount。然后,在另一个计时器事件中,检查计数器是否renderCount过去3-5秒没有变化,那么我们可以假设渲染已经完成。

监视子级并检查是否不再进行渲染的代码可能如下所示:

app.directive('whenRenderingDone',  function($interval, $parse){
    return {
        link: function (scope, el, attrs) {
            var renderingCount = 0;
            function watchForChildren() {
                scope.$watch(function(){
                    return $(':input', el).length;
                }, function(newVal, oldVal){
                    if (newVal) {
                        renderingCount++;
                    }
                })
            }
            watchForChildren();
            //Check counter every 3 seconds, if no change since last time, this means rendering is done.
            var checkRenderingDone = $interval(function(){
                var lastCount = lastCount || -1;
                if (lastCount === renderingCount) {
                    var func = $parse(attrs.whenRenderingDone);
                    $interval.cancel(checkRenderingDone);
                    func(scope);
                }
                lastCount = renderingCount || -1;
            }, 3000);
        }
    }
});

我会尝试实施上述方法,如果您有反馈,请告诉我。

Tarek


我开发了以下指令,该指令在 Chrome 和 IE11 下运行良好:

app.directive('whenRenderingDone',  function($timeout, $parse){
    return {
        link: function (scope, el, attrs) {
            var lastCount;
            var lastTimer = 5000; // Initial timeout
            //Check counter every few seconds, if no change since last time, this means rendering is done.
            var checkRenderingDone = function (){
                var mainPromiseResolved = scope.mainPromiseResolved;
                lastCount = lastCount || -1;
                if (lastCount === el.find('*').length && mainPromiseResolved) {
                    console.log('Rendering done, lastCount = %i', lastCount);
                    var func = $parse(attrs.whenRenderingDone);
                    func(scope);
                } else {
                    lastCount = el.find('*').length;
                    console.log('mainPromiseResolved = %s, lastCount %i', mainPromiseResolved, lastCount)
                    console.log('Rendering not yet done. Check again after %i seconds.', lastTimer/1000.00);
                    stopCheckRendering = $timeout(checkRenderingDone, lastTimer); 
                    lastTimer = lastTimer - 1000;
                    if (lastTimer <= 0) {
                        lastTimer = 1000;
                    }
                    return stopCheckRendering;
                }
            }
            var stopCheckRendering;
            stopCheckRendering = checkRenderingDone();
            el.on('$destroy', function() {
                if (stopCheckRendering) {
                    $timeout.cancel(stopCheckRendering);
                }
              });
        }
    }
});

希望本文对您有所帮助,如果您有任何需要改进的意见,请告诉我。See this让您了解它是如何工作的。

Tarek

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 AngularJS 中检测 HTML 渲染何时完成 的相关文章

  • 如何从此 d3.js layout.tree 获取树祖先和树后代的列表?

    我正在尝试和修改this https bl ocks org mbostock 4339083d3 js 的示例 用于根据 JSON 树结构绘制树 这就是树的一部分开始时的样子 我正在尝试进行两个单独的修改 但我不知道该怎么做 当单击节点的
  • Bootstrap 居中 div 内的文本左对齐

    我有一段 4 行诗 位于居中的 div 中 因为它是诗歌 所以我需要将 4 行左对齐 但不要对齐到 div 的左侧 这是它的居中方式 Lorem ipsum dolor sit amet onsectetur adipisicin Dolo
  • 淡出图像上的文字

    我知道如何使用 CSS 透明渐变淡出纯色背景上的文本 但是如何才能淡出图像背景上的文本呢 这是我想要的一个例子 注意 我需要像图像一样的静态效果 而不是动态过渡 CSS mask image可能是您正在寻找的 div background
  • 单击按钮滚动到特定 div

    我有一个具有固定菜单和内容框 div 的页面 单击菜单时 内容框滚动到特定 div 到目前为止 一切都很好 这是这里的示例 https jsfiddle net ezrinn 8cdjsmb9 11 https jsfiddle net e
  • WebRTC - 消除/减少共享视频流的设备之间的延迟?

    我很抱歉没有发布任何代码 但我正在尝试了解更多有关延迟和webRTC 最好的方法是什么remove latency between two or more devices that are sharing a video stream 或者
  • 我需要在条形图中显示 HTML/Js 页面的 Div 结果?

    我需要在条形图中显示下面提到的代码的结果 是否可以显示下面代码的结果以供调查显示在条形图中 所以我按照几个伙伴的建议将代码放在这里 您可以在代码中看到我正在打印调查结果 但我也想显示蜘蛛图 但我不知道如何继续 您可以检查这个问题中的代码 h
  • HTML 电子邮件 - Outlook 2013 中图像之间的间隙

    I m composing an HTML email which looks fine in every major email client except Outlook 2013 which is adding vertical ga
  • 导航时 Internet Explorer 9 中的图像闪烁白色

    我正在使用 XHTML 1 1 CSS 3 0 开发一个网站 但 Internet Explorer 9 出现问题 每次我将页面从 主页 更改为 功能 时 各种图像在填充之前都会闪烁 白色 出现这种 白色闪烁 每次页面更改时 我见过很多堆栈
  • 多彩文本框的想法?

    在我的网站中 我想实现一个文本框 人们可以在其中输入一组由分隔符分隔的字符串 例如本页底部的标签文本框 由空格 分隔符 分隔的标签 字符串 为了让用户更清楚 为每个字符串提供不同的背景颜色或其他视觉提示是很有意义的 我认为使用常规输入 文本
  • AngularJS 中的重定向状态

    这是状态配置 angular module grabhutApp config function stateProvider urlRouterProvider stateProvider ACCOUNT state account abs
  • 如何使用 Angular 1.5 中的组件为每个页面设置标题

    我最近开始使用 Angular 1 5 组件 我的应用程序中有多个页面 所以我决定创建一个
  • 如何将webview内容划分为多个页面

    我必须使用 Android 上的 PdfDocument 从 webView 创建 PDF https developer android com reference android graphics pdf PdfDocument htm
  • Internet Explorer 不渲染从 JQuery ajax 帖子返回的 html

    我有一个带有输入框的页面 其 onkeyup 根据输入的内容 搜索字段 触发 JQuery ajax 帖子 ajax 调用回发的 html 应该填充页面上的另一个 div 这是 jquery ajax 帖子 var o me results
  • Bootstrap .row margin-left: -15px - 为什么它会缩进(来自文档)

    我在 Bootstrap 文档中看到了这一行 http getbootstrap com css grid intro http getbootstrap com css grid intro It says 列通过填充创建装订线 列内容之
  • 使用 ng-if 内容短暂呈现然后消失

    我的页面上有一些内容包含在 ng if 中 如下所示 div class text danger p strong Message displayed to User strong p div 然后在我的 Angular js 控制器中我有
  • 在 vuejs 上将 \n 替换为新行

    我正在尝试将 n 字符替换为来自端点的数据的新行 I tried p item licensedocument legal documentText replace r n r n g br p 并没有奏效 当我将replace 写入问题末
  • 如何实现Contenteditable属性的Ctrl+A功能?

    我正在尝试为用户显示带有一些示例代码的 div 我希望他们能够在 div 内部进行选择并使用 Ctrl A 选择所有示例代码 但我不希望他们能够编辑实际文本 以免意外删除一点 然后它不会工作 我现在通过 div 上的 contentedit
  • Ace Editor 自动完成和多种语言

    如何为 Ace 编辑器创建自动完成功能以及如何突出显示 php 中的 html javascript 和 csshttp ace ajax org http ace ajax org
  • 无法使用python和beautifulsoup抓取网页中的某些href

    我目前正在使用 Python 3 4 和 bs4 爬取网页 以收集塞尔维亚在里约 2016 年的比赛结果 所以网址here http rio2016 fivb com en volleyball women teams srb serbia
  • 在 Chrome 扩展中使用页面的 Angular JS

    我有一个 HTML 页面 其中有一些使用 Angular 配置的 DOM 现在我正在构建一个 chrome 扩展来修改文本框中的值 element value newValue不起作用 因为文本框是用 Angular 设计的 在阅读了一些资

随机推荐

  • 如何让 NHibernate 只生成 SQL 而不执行它?

    我知道如何在运行时使用以下命令将 SQL 记录到 log4net NLog trace 窗口show sql配置选项 我正在寻找的是一种给予Query
  • Jquery浏览器的停止按钮事件

    有没有办法检测用户何时单击任何浏览器上的停止按钮 我想在用户上传文件时决定单击停止按钮时停止脚本运行 这样我就可以触发脚本刷新页面 不幸的是 浏览器的停止按钮不会影响 AJAX 请求 如果你想取消 AJAX 请求 可以像下面这样中止它 va
  • 如何在ionic2中传递数据

    我通过http获取数据 我想将数据传递到 PlacesListPage 我的数据中有 id name category 我想在 PlacesListPage 中使用这些内容 如下所示 xxx id xxx name 请帮助我 xxx 例如
  • 如何衡量承诺的执行时间?

    我正在尝试编写一个函数来测量另一个函数的执行时间 export class Profiler public measureSyncFunc fn gt any Promise
  • 从命令行使用 nntool [MATLAB]

    我有这个代码 in 5 columns of data points out 1 column of data points net newfit in out 5 net train net in out 现在我想要 访问误差变量生成的
  • 在matlab中加载stl文件并转换为3D数组

    我有一个 stl 文件 我已使用 stlread 函数将其加载到 Matlab 中 此时我有一组面和顶点 如何将这些面和顶点转换为 512x512x100 数组等 3D 二进制数组以获得二进制 3D 体积 啊你真幸运 我最近正在处理 STL
  • C++ 中运算符 << 的重写

    我正在为我的学校做一个 C 项目 我有两个班级 雇员和老师 Teacher 源自 Employe 并优先于其职能 我们重写运算符 lt lt 打印员工或教师的一些信息 每个班级都有一个const int attribute LevelAcc
  • 密钥“PRIMARY”重复输入“0”

    我不明白为什么在尝试填充此表时会收到此错误 目前表中没有任何内容 所以我不明白为什么会有重复的 这是我正在使用的代码 INSERT INTO Suppliers supp id company name town phone Values
  • 调试rails 3.1.1 应用程序

    我尝试向使用 ruby 1 9 2 的 Rails 3 1 1 应用程序添加调试器 我已将以下内容添加到我的 gemfile 中 gem ruby debug19 require gt ruby debug 我收到以下错误 rvm gems
  • 使用 PHP 发送批量电子邮件

    当新用户加入时 我必须向网站中的所有用户发送邮件 我的问题是脚本在发送大约 400 封邮件后停止执行 我已将 set time limit 设置为 0 并且我在发送 10 封邮件后给予 sleep 2 此问题背后的原因可能是什么 此问题的任
  • 列表列表到词典列表

    如何将列表列表转换为字典列表 更具体地说 我该如何处理 a1 b1 c1 d1 e1 f1 g1 h1 i1 a2 b2 c2 d2 e2 f2 g2 h2 i2 a3 b3 c3 d3 e3 f3 g3 h3 i3 a4 b4 c4 d4
  • JBoss 7.1 Weld 在耳边的罐子里发现了 Managed Bean,但战争并没有

    jboss as 7 1 1 动态 Web 模块 3 0 JSF 2 0 Mojarra Eclipse Indigo sr2 我有一个 EAR Ynale ear 其中包含一个 YnaleImpl jar 和一个 Ynale war Yn
  • 我如何操作一个非常大的列表

    我有超过 10000 个文件 我首先将目录设置为文件所在的文件夹 然后我用以下命令链接到所有文件 txt像这样的格式 filenames lt list files path to the file pattern txt full nam
  • DENSE_RANK() 无重复

    我的数据如下所示 col1 col2 denserank whatiwant 1 1 1 1 2 1 1 1 3 2 2 2 4 2 2 2 5 1 1 3 6 2 2 4 7 2 2
  • 如果通过 Xcode 安装应用程序,它会在我的 iOS 设备上继续运行多长时间?

    刚刚开始使用 iOS 并构建了一个非常简单的应用程序 我在 iPad 上使用和测试了该应用程序 如果我在 Xcode 中单击 停止 应用程序仍然可以在我的 iPad 上启动和使用 而无需 Xcode 调试 考虑到我没有 Apple 开发者帐
  • Android 平台上的“Fatal signal 7 (SIGBUS) at 0x5937abd0 (code=2)”到底是什么意思?

    致命信号 7 SIGBUS at 0x5937abd0 code 2 的确切含义是什么 回溯和堆栈信息如下 12 23 17 43 37 904 F libc 16421 Fatal signal 7 SIGBUS at 0x5937abd
  • 自定义 WordPress 3.5.2 插件“您没有足够的权限访问此页面。”

    我一直在尝试集成一个名为的自定义 WordPress 插件custom rss通过以下方式进入 WordPresshttp net tutsplus com tutorials wordpress creating a custom wor
  • 删除android中的特定联系人

    在我的应用程序中 我需要删除特定的CONTACT从电话通讯录中 但我只删除了特定号码 而不是整个联系人 所以请帮助我 提前致谢 要删除所有联系人 请使用以下代码 ContentResolver cr getContentResolver C
  • 升级后,@MapsId 在保存现有实体时抛出错误,但在其他方面工作正常

    我正在努力升级Spring Boot 1 5 21 项目 Java 8u221 to Spring Boot 2 1 9 Java 11 0 2 开放 在这两种情况下 我们都使用带有 spring boot 启动器和依赖解析器的 gradl
  • 如何在 AngularJS 中检测 HTML 渲染何时完成

    我对这个课题进行了广泛的研究 但无论我做什么 我发现实现这个目标都极其困难 我想在 AngularJS Web 应用程序中完全呈现所有元素时执行代码 我想我找到了建议使用路由器和视图的解决方案 但我无法在我的情况下使用它 因为它似乎需要某些