推迟在应用程序运行angularjs上创建控制器/服务
Defer creation of controllers/services on app run angularjs
每次路由更改时,我都会检查是否设置了一个具有当前记录的用户详细信息的变量,如果没有设置该变量,我只需重定向到登录页面。
现在我正在尝试实现某种"记住我"的功能,所以每次路由更改时,如果变量用户不存在,而不是重定向到登录页面,我会检查本地存储中的"authtoken",如果设置了,我会调用一个检查函数,将authtoken传递给服务器,返回用户,应用程序将以与手动登录后相同的方式工作(返回与check功能相同的用户)。
我确信这不是最好的方法。
如果我重新加载页面,首先我会运行check函数,该函数将authtoken发送到服务器并等待响应,如果用户存在,则该值将分配给rootscope中的变量。
我有不同的服务使用rootscope中的变量,例如
angular.module('myApp')
.service('AdminService', function AdminService($rootScope, $http, StorageService) {
var authtoken = StorageService.get('authtoken');
var clientId = $rootScope.loggedUser.id;
当然,当check函数运行时,它会等待响应,但服务正在实例化,$rootScope.loggedUser.id不存在。
如何告诉应用程序等待检查功能收到响应?
这是我的代码
....
}).run(function($rootScope, $location, AuthService, StorageService) {
var intended = $location.path();
AuthService.check().success(function(data) {
if(data.user) {
$rootScope.loggedUser = data.user;
$location.path(intended);
} else $location.path('login');
});
$rootScope.$on('$routeChangeStart', function() {
if($rootScope.loggedUser) {
....
例如,如果用户将页面标记为"myapp.com/#/admin/users",我不想重定向到登录,如果我在本地存储中有authtoken,但这会导致使用服务的控制器被实例化,该控制器需要尚未填充的$rootScope.loggedUser.id。
我想只在页面(重新)加载时(而不是每次用户更改路由时)运行函数检查。
如果您需要一个服务调用来检查您的auth令牌,我建议您重新检查您的设计。Auth令牌通常存储有到期时间,因此您可以在不调用服务器的情况下检查是否在到期期限内。您不会损害安全性,因为身份验证令牌由服务器签名,并在您进行服务器调用以执行任何有用的操作时进行验证。因此,在正常情况下,不需要单独的check
调用。
但是,如果您坚持,这个用例最好使用路由的resolve
属性来处理。然而,这意味着,每个关心用户登录状态的路由都必须定义一个解析属性。这并不意味着您必须在每次更改路线时呼叫服务。
不使用$rootScope.loggedUser
来存储用户,而是由AuthService
缓存并通过resolve
参数注入。
因此,您可以执行以下操作:
$routeProvider
.when("some/secure/route", {
controller: "SecureCtrl",
resolve: {
user: AuthService.checkUser
}
});
在您的AuthService:中
...
checkUser: function(){
var deferred = $q.defer();
if (cachedUser){
deferred.resolve(cachedUser);
} else {
AuthService.check().success(
function(data){
// cachedUseris defined at AuthService's scope
cachedUser = data.user;
deferred.resolve(data.user);
});
}
return deferred.promise;
}
然后,在您的控制器中:
.controller("SecureCtrl", function(user){
$scope.userId = user.id;
}
- 在控制器中创建StandardListItem并在赢得的项目上按下事件'不要开火
- 阻止控制器创建新的作用域对象
- 使用DOM中的信息创建一个控制器/服务来持久化数据
- 如何将从jQuery创建的数组传递给控制器方法
- 如何从控制器创建进度条来处理MVC3中的长流程
- 角度指令和属性Don'在控制器内创建和设置时无法工作
- 使用双向绑定将对象从角度视图动态添加/创建到控制器的数组
- 每次使用角度控制器都会创建一个新的if实例
- 使用angular.module创建控制器有什么好处(如果有的话)
- 如何创建可以使用 AngularJS 上的控制器访问的帮助程序类
- 创建通用控制器功能
- 茉莉花+业力+角度测试创建控制器
- $resolve在创建控制器之前不会添加到$scope
- 如何在 Ember.ContainerView 中为 View 创建控制器
- 推迟在应用程序运行angularjs上创建控制器/服务
- 在ng视图页面中创建控制器
- 使用angular.js在单独的文件夹中创建控制器文件
- AngularJS-创建控制器之间的区别
- Angular 是否有创建控制器时的事件
- AngularJS——创建控制器和服务的不同方式,为什么?