2

我一直在寻找这个问题的答案,但对于如何解决这个问题并没有任何明确或明确的答案。

在我的 anguarJS 应用程序中,我想确保在加载/引导 AngularJS 之后的第一件事,它通过访问服务器$http并获取一些设置(通过称为 api: /api/settings/get) - 取决于子域和/或是否存在是 JWT 或其他用户会话,它将检索一些应添加到$rootScope.

我的问题是我无法“停止”应用程序,只有当且仅当设置已获取并填充$rootScope. 如果 fetch 或 settings 调用可能失败,应用程序应该“停止” - 所以这些设置很早就加载是至关重要的,所以我知道一切(服务、控制器、指令等)都可以访问它们。

我已经尝试使用$broadcast事件并将其放入我的.run函数中,但它似乎仍然可以解决应用程序(可能很明显是因为它是异步的)。

apiConnector.get('api/settings/get').then(function(settings) {
  $rootScope.settings = settings;
  $rootScope.$broadcast('settings-fetched');
});

但是,我不喜欢这种方法,并且要求我在任何地方都听这个事件。

我的路线是公开的和受限制的。

我希望有人能在正确的方向上帮助我解决这个问题。

4

1 回答 1

0

由于您使用的是 ui-router,我建议在进入默认状态之前使用 resolve:https ://github.com/angular-ui/ui-router/wiki#resolve

来自 ui-router 文档的示例路由配置:

$stateProvider.state('myState', {
      resolve:{
         // Example using function with returned promise.
         // This is the typical use case of resolve.
         // You need to inject any services that you are
         // using, e.g. apiConnector in this example
         settingsObj:  function(apiConnector){
            return apiConnector.get('api/settings/get');
         }
}

如果此获取失败,您可以通过使用.then()将用户重定向到应用程序或 w/e 来解决此问题。与通常的角度承诺一样。

于 2016-10-11T10:58:54.127 回答