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

18 浏览
0 Comments

如何在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

0
0 Comments

在AngularJS中,我们如何检测HTML渲染完成呢?上面的代码提供了一个指令whenRenderingDone来解决这个问题。

这个指令通过link函数将一个计数器lastCount与DOM元素中的子元素数量进行比较,如果两者相等且mainPromiseResolved为真,则表示渲染已经完成。在计数器每隔几秒钟检查一次,如果自上次检查以来没有变化,则表示渲染已经完成。

如果渲染未完成,则更新计数器,并输出相应的日志信息。同时,通过$parse函数将attrs.whenRenderingDone解析为一个函数,并调用该函数。

指令在DOM元素的销毁时,取消计时器的执行。

通过将whenRenderingDone作为属性添加到DOM元素的更高层级,我们可以在渲染完成时调用指定的函数。

以上就是如何在AngularJS中检测HTML渲染完成的解决方法。如果你有任何改进意见,请告诉我。点击此处了解更多信息。

0
0 Comments

在AngularJS中,要检测HTML渲染何时完成,你可以使用$$postDigest来在digest循环完成后运行代码。你可以在这里了解更多关于scope生命周期的信息:here

// 在这里进行$apply操作或者直接进入digest循环
scope.$apply(function () { ... });
...
scope.$$postDigest(function () {
  // 在这里运行任何代码,在digest循环中所有的watch完成后运行
  // 这意味着它在所有的watch操作DOM之后、浏览器渲染之前运行一次
});

谢谢!我会尝试一下这个方法。然而,我记得任何以$$开头的AngularJS API并不是100%安全的,是这样吗?

抱歉,你的解决方案对我没有起作用。请参考我上面的解决方案,这样你就能更好地了解我正在尝试做什么。谢谢!

0