如何在AngularJS中检测HTML渲染完成
如何在AngularJS中检测HTML渲染完成
我对这个主题进行了广泛的研究,但无论我做什么,都发现实现这个目标非常困难。
我想在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(); //每3秒钟检查一次计数器,如果与上次相比没有变化,这意味着渲染已完成。 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
在AngularJS中,我们如何检测HTML渲染完成呢?上面的代码提供了一个指令whenRenderingDone
来解决这个问题。
这个指令通过link
函数将一个计数器lastCount
与DOM元素中的子元素数量进行比较,如果两者相等且mainPromiseResolved
为真,则表示渲染已经完成。在计数器每隔几秒钟检查一次,如果自上次检查以来没有变化,则表示渲染已经完成。
如果渲染未完成,则更新计数器,并输出相应的日志信息。同时,通过$parse
函数将attrs.whenRenderingDone
解析为一个函数,并调用该函数。
指令在DOM元素的销毁时,取消计时器的执行。
通过将whenRenderingDone
作为属性添加到DOM元素的更高层级,我们可以在渲染完成时调用指定的函数。
以上就是如何在AngularJS中检测HTML渲染完成的解决方法。如果你有任何改进意见,请告诉我。点击此处了解更多信息。
在AngularJS中,要检测HTML渲染何时完成,你可以使用$$postDigest
来在digest循环完成后运行代码。你可以在这里了解更多关于scope生命周期的信息:here
// 在这里进行$apply操作或者直接进入digest循环 scope.$apply(function () { ... }); ... scope.$$postDigest(function () { // 在这里运行任何代码,在digest循环中所有的watch完成后运行 // 这意味着它在所有的watch操作DOM之后、浏览器渲染之前运行一次 });
谢谢!我会尝试一下这个方法。然而,我记得任何以$$
开头的AngularJS API并不是100%安全的,是这样吗?
抱歉,你的解决方案对我没有起作用。请参考我上面的解决方案,这样你就能更好地了解我正在尝试做什么。谢谢!