$viewContentLoaded没有触发

26

$viewContentLoaded 在我的 Angular 控制器中从未触发。以下是代码:

function MyController($scope)
{
    $scope.$on('$viewContentLoaded', function()
    {
        alert("blah");
    });
}

永远不会触发断点,也永远不会弹出警报。我认为这是相当标准的用法,所以我不确定它可能是什么,但它肯定没有被触发。控制器中的其他所有内容都在正常工作。

这是什么原因引起的?


1
错误控制台里有什么吗? - Jordan
1
@MikePateras 你在视图中初始化控制器了吗? - Bogdan Rybak
1
Jordan,控制台没有任何输出(没有任何错误或警告)。RickCigarette,如果你是指通过ng-controller在HTML中绑定它,那么是的。 - Mike Pateras
1
你在HTML中通过ng-controller包含这个控制器的位置在哪里?你的<ng-view>又在哪里? - dnc253
1
具有控制器的div是ng-view元素的第一个子元素。 - Mike Pateras
3个回答

44

试试这个替代方案:

  function MyController($scope)
    {
        $scope.$watch('$viewContentLoaded', function()
        {
            alert("blah");
        });
    }

5
这不起作用。DOM 还没有应用 CSS 渲染。我必须使用 $timeout(fn, 0) 包装 alert('blah') 才能获得完全渲染的页面。视图已加载但尚未被 Angular 解析。 - chovy
2
chovy,是的。这取决于您所尝试做的事情。如果您想要等待CSS加载等操作,则可能需要执行以下操作:$scope.$watch('$viewContentLoaded', function(){ $timeout(function () { alert("blah blah"); }, 500); }); - CodeOverRide

25

根据您上面的评论,听起来您有类似这样的东西:

<ng-view>
   <div ng-controller="MyController"></div>
</ng-view>

我不确定ng-view标签中的内容会产生什么作用,但是$viewContentLoaded是从ng-view作用域中发出的。这意味着它只会从ng-view向上传递,因此您的控制器永远不会捕获它。


4
是的,我自己也发现了这一点,当控制器在ng-view之外时确实有效。原来我想要的是includeContentLoaded。谢谢! - Mike Pateras

3
我通过在app.js路由提供程序中指定控制器来解决了这个问题,而不是在视图中的div中使用ng-controller。只有在需要使用$viewContentLoaded时,我才使用此方法,否则我使用ng-controller。
angular.module('myapp', [...])
.config(function ($routeProvider, $locationProvider) {
   $routeProvider
      .when('/MyRoute', {templateUrl: 'views/MyView.html', controller: MyController})
  });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接