2016-11-20 60 views
1

我正在使用AngularJS,并且我想在DOM完全呈现时运行一​​些操作。
看来我可以观看'$ viewContentLoaded'事件或在文档上使用jQuery'ready'方法。

这两种方法中的哪一种是最佳方法,为什么?

var myapp = angular.module('myapp', []) 
.run(function($document, $rootScope) { 

    $rootScope.$on('$viewContentLoaded', function() { 
     console.log('view content loaded'); 
    }); 

    $document.ready(function() { 
     console.log('document ready');    
    }); 
}); 
+1

我添加了一个答案来试图描述这些差异,但是当我写这个答案的时候,我发现这个*看起来像*一个[XY问题](http://meta.stackexchange.com/questions/66377 /是什么 - 是最XY-问题/ 66378#66378)。 “当DOM完全呈现时运行一​​些动作”具有很多不同的含义,并且绝大多数都是通过角度自动处理的....如果我的回答没有说​​明您的担忧,那么您可能需要更新这个问题以***为例,你首先担心DOM。 – Claies

回答

2

$document.ready()是Angular以外的调用,发生时一次当DOM准备好执行JavaScript时。它在$location的变化中不被Angular调用。因此,与Angular相关的此功能的唯一用途是如果您想手动使用angular.bootstrap()。由于Angular必须等待$document.ready(),即使使用ng-app,控制器也应该处理除手动引导以外的任何代码。

$viewContentLoaded是一个角度事件,它是ng-route module的一部分。无论何时重新加载ng-view元素的内容,它都会由ngView发出。该事件是角度感知的,这意味着它会导致一个摘要循环,并且由于观看此事件而执行的任何代码都将影响内容视图。此外,每次加载新路线时,此事件都会发出,与仅发射一次的$document.ready()不同。通常,如果您的目标是在应用程序启动时初始化变量,那么在控制器中初始化它们是安全的选择。如果您的目标是在每次渲染新视图时初始化变量,则通常可以在控制器中为每个视图执行,但$viewContentLoaded是合理的后备。应该几乎从不与Angular应用程序一起使用,因为它不是角度感知函数。

1

如果你看看他们的定义,$rootscope是您从开始您的应用程序的基础范围。另一方面,$document代表整个javascript window.document

然后,包含您应用程序的DOM部分可能会准备就绪,但不是整个文档。

我应该注意到,在大多数网络应用程序(至少我看到的那些)中,$ rootcope位于身体标签上,在这种情况下,它几乎是相同的。