在AngularJS应用程序初始化之前,javascript – $http请求?
为了确定用户的会话是否被认证,我需要在加载第一个路由之前向服务器发一个$ http请求。在加载每个路由之前,认证服务会检查用户的状态和路由所需的访问级别,如果用户没有为该路由进行身份验证,则重定向到登录页面。当应用程序首次加载时,它不知道用户,所以即使他们有一个身份验证的会话,它将始终重定向到登录页面。所以要解决这个问题,我试图向服务器发出请求,作为应用程序初始化的一部分,用户状态。问题是,显然$ http调用是异步的,那么如何在请求完成之前停止应用运行?
我对于一般的角色和前端开发非常新鲜,所以我的问题可能是对JavaScript而不是Angular的误解。
您可以通过在routingProvider中使用resolve来完成此任务。
这将允许您在控制器启动之前等待一些承诺解决。 从文档引用:
简单的例子 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,我已经从那个家伙那里学到了大部分的东西 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |