加载内容后要调用的AngularJs事件

use*_*772 158 events loaded angularjs

我有一个函数,我想在加载页面内容后调用.我读到了$ viewContentLoaded,它对我不起作用.我正在寻找类似的东西

document.addEventListener('DOMContentLoaded', function () { 
     //Content goes here 
}, false);
Run Code Online (Sandbox Code Playgroud)

以上调用在AngularJs控制器中对我不起作用.

Rez*_*eza 160

根据$ viewContentLoaded的文档,它应该工作

每次重新加载ngView内容时都会发出.

$viewContentLoaded 发出的事件意味着要接收此事件,您需要一个父控制器

<div ng-controller="MainCtrl">
  <div ng-view></div>
</div>
Run Code Online (Sandbox Code Playgroud)

MainCtrl你可以听取这个事件

  $scope.$on('$viewContentLoaded', function(){
    //Here your view content is fully loaded !!
  });
Run Code Online (Sandbox Code Playgroud)

检查演示

  • 这种方法的问题在于控制器此时尚未完全初始化. (57认同)
  • @Reza他是正确的,当添加dom但在angular完成处理dom之前,会触发此事件.您可以通过添加id或类作为角度变量来测试它,并尝试使用jQuery在$ viewContentLoaded中找到它.你找不到它. (11认同)
  • 当你有`ng-repeat`和几个嵌套指令将根据复杂的循环和条件生成HTML/Content时,此选项将不起作用.即使在触发了`$ viewContentLoaded`事件之后,渲染仍会持续一段时间.如何确保所有元素都已完全呈现然后执行某些代码?任何反馈? (4认同)
  • 可以在$ rootScope级别调用相同的内容.而不是$ scope.$ on,它应该是$ rootScope.$和app.run()块内部 (2认同)

har*_*man 101

角度<1.6.X

angular.element(document).ready(function () {
    console.log('page loading completed');
});
Run Code Online (Sandbox Code Playgroud)

角度> = 1.6.X

angular.element(function () {
    console.log('page loading completed');
});
Run Code Online (Sandbox Code Playgroud)

  • 你可以在你的controllers.js中听它 (3认同)
  • 也可以在主app.js文件中正常工作. (2认同)

jus*_*opi 76

固定 - 2015.06.09

使用指令和角元素ready方法如下:

JS

.directive( 'elemReady', function( $parse ) {
   return {
       restrict: 'A',
       link: function( $scope, elem, attrs ) {    
          elem.ready(function(){
            $scope.$apply(function(){
                var func = $parse(attrs.elemReady);
                func($scope);
            })
          })
       }
    }
})
Run Code Online (Sandbox Code Playgroud)

HTML

<div elem-ready="someMethod()"></div>
Run Code Online (Sandbox Code Playgroud)

或者那些使用controller-as语法的人......

<div elem-ready="vm.someMethod()"></div>
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,您可以根据自己的用户界面广泛或细化,并从控制器中删除DOM逻辑.我认为这是推荐的Angular方式.

如果您在同一节点上运行其他指令,则可能需要优先处理此指令.

  • 在`elem.ready()`周围添加`$ timeout(function(){})`之后为我工作.否则它正在抛出一个"$ digest in progress"错误.但无论如何,非常感谢!过去一小时我一直在努力解决这个问题. (5认同)

blu*_*lue 63

您可以通过添加{{YourFunction()}}HTML元素后直接调用它.

这是一个Plunker Link.

  • 调用这样的函数时.确保调用一次,否则摘要周期将无限运行并显示错误 (13认同)
  • 您能否详细说明您的答案,添加一些关于您提供的解决方案的更多描述? (6认同)
  • 简单明快:) (2认同)
  • 我喜欢这个解决方案,它真的很简单 (2认同)

Saa*_*qar 20

在使用谷歌图表处理时,我必须实现这个逻辑.我做的是在我的html内部控制器定义结束时我添加了.

  <body>
         -- some html here -- 
--and at the end or where ever you want --
          <div ng-init="FunCall()"></div>
    </body>
Run Code Online (Sandbox Code Playgroud)

在那个函数中简单地调用你的逻辑.

$scope.FunCall = function () {
        alert("Called");
}
Run Code Online (Sandbox Code Playgroud)