$ viewcontentloaded上的方法是异步触发。为了解决我的问题,我在根范围内有一个变量,即我的主控制器,需要在我的视图控制器加载之前进行初始化。在 module.run 中,我调用了一个同步函数来初始化 $ rootScope.session 。在我的路径控制器视图中,我正在检查会话的状态,这被称为
$scope.$on('$viewContentLoaded', function() {
$scope.initialize();
});
但有时候在页面刷新时,我得到 $ rootScope.session 的未定义值,因为它可能稍后初始化。那么,是否有任何方法可以在视图加载之前初始化像rootscope这样的同步。如果我通常在我的控制器,$ viewContentLoaded或$ routeChangeSuccess中调用 $ scope.initialize(); ,那么好奇心会如何影响它。 提前谢谢。
答案 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'文件中的引导脚本。
<强>参考强>