在初始化根作用域之前执行$ viewContentLoaded

时间:2015-02-24 09:15:17

标签: angularjs

$ viewcontentloaded上的方法是异步触发。为了解决我的问题,我在根范围内有一个变量,即我的主控制器,需要在我的视图控制器加载之前进行初始化。在 module.run 中,我调用了一个同步函数来初始化 $ rootScope.session 。在我的路径控制器视图中,我正在检查会话的状态,这被称为

$scope.$on('$viewContentLoaded', function() {
            $scope.initialize();
        });

但有时候在页面刷新时,我得到 $ rootScope.session 的未定义值,因为它可能稍后初始化。那么,是否有任何方法可以在视图加载之前初始化像rootscope这样的同步。如果我通常在我的控制器,$ viewContentLoaded或$ routeChangeSuccess中调用 $ scope.initialize(); ,那么好奇心会如何影响它。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

  

那么,是否有任何方法可以在视图加载之前初始化像rootscope这样的同步。

使用$controller服务手动创建控制器,如在单元测试中一样。

  $controllerProvider.register('FooCtrl', FooCtrl);
  ctrl = $controller('FooCtrl', {$scope: scope});

$broadcast从主控制器到孩子的自定义事件:

  function mainCtrl($rootScope)
    {
    $rootScope.$broadcast('abc');
    }

  function secondCtrl($scope)
   {
   $scope.$on('abc', function(event) { $scope.initialize(); });
   }

或使用try/catch block和带定时器的递归调用。

  

这些或多或少是您在AngularJS中实现延迟加载所需的步骤。总之,您首先要定义应用程序模块以保留相关提供程序的实例。然后,您将定义您的惰性工件,以使用提供程序而不是模块API注册自己。然后使用在路由定义中返回promise的'resolve'函数,您将加载所有延迟工件并在加载后解析promise。这可确保在呈现相关路径之前所有延迟工件都可用。另外,不要忘记解决$ rootScope中的承诺。$ apply,如果解决方案将在AngularJS之外发生。然后,您将创建一个“引导程序”脚本,该脚本在引导应用程序之前首先加载应用程序模块。最后,您将链接到'index.html'文件中的引导脚本。

<强>参考