为了确定用户的会话是否被认证,我需要在加载第一个路由之前向服务器发一个$ http请求。在加载每个路由之前,认证服务会检查用户的状态和路由所需的访问级别,如果用户没有为该路由进行身份验证,则重定向到登录页面。当应用程序首次加载时,它不知道用户,所以即使他们有一个身份验证的会话,它将始终重定向到登录页面。所以要解决这个问题,我试图向服务器发出请求,作为应用程序初始化的一部分,用户状态。问题是,显然$ http调用是异步的,那么如何在请求完成之前停止应用运行?
我对于一般的角色和前端开发非常新鲜,所以我的问题可能是对JavaScript而不是Angular的误解。
您可以通过在routingProvider中使用resolve来完成此任务。
原文链接:https://www.f2er.com/angularjs/144385.html这将允许您在控制器启动之前等待一些承诺解决。
从文档引用:
resolve – {Object.=} – An optional map of dependencies which should be injected into the controller. If any of these dependencies are promises,the router will wait for them all to be resolved or one to be rejected before the controller is instantiated. If all the promises are resolved successfully,the values of the resolved promises are injected and $routeChangeSuccess event is fired.
简单的例子
app.config(['$routeProvider',function($routeProvider) { $routeProvider. when('/',{templateUrl: 'home.html',controller: 'MyCtrl',resolve: { myVar: function($q,$http){ var deffered = $q.defer(); // make your http request here and resolve its promise $http.get('http://example.com/foobar') .then(function(result){ deffered.resolve(result); }) return deffered.promise; } }}). otherwise({redirectTo: '/'}); }]);
然后将myVar注入您的控制器,其中包含承诺数据。
避免额外的DI参数
您还可以通过返回您要注入的服务来避免额外的DI参数:
app.config(['$routeProvider',function($routeProvider) { $routeProvider. when('/',resolve: { myService: function($q,$http,myService){ var deffered = $q.defer(); /* make your http request here * then,resolve the deffered's promise with your service. */ deffered.resolve(myService),return deffered.promise; } }}). otherwise({redirectTo: '/'}); }]);
显然,在执行此类操作时,您必须将共享服务中的任何地方的请求存储在您的请求中。
看看Angular Docs / routeProvider
在egghead.io,我已经从那个家伙那里学到了大部分的东西