在AngularJS中,在控制器之间共享数据,并添加用于身份验证的回调行为

In AngularJS, share data between controllers and add callback behavior for authentication

本文关键字:身份验证 用于 回调 添加 数据 AngularJS 控制器 之间 共享      更新时间:2023-09-26

我目前正在开发Angular前端,试图通过使用breeze或restangular来避免事情过于复杂,但仍然可以正确地编码。问题是,只写了几行代码后,我的代码似乎变得比其他任何东西都臃肿。

关键是将用户保存在cookie中,并在有人登录时返回。

身份验证服务

var userResource=$resource('/users/:id');var currentUser=$cookieStore.get("user")||{};返回{currentUser:currentUser,login:函数(userId,type,callback){var thiz=这个;return userResource.save({id:userId},{},function(promise){promise.then(函数(结果){thiz.currentUser=结果数据;$cookieStore.put("用户",thiz.currentUser);if(回调){callback(thiz.currentUser);}});});},用户:函数(){return userResource.query();}};

AuthCtrl控制器

$scope.login=函数(userId,类型){Auth.login(用户ID、类型、函数(结果){$scope.user=结果;});};Auth.login("someuser"、"basic"、函数(结果){$scope.user=结果;});$scope.users=Auth.users();

在另一个控制器中:

$scope.user=Auth.currentUser;Snippets.query({user:$scope.user.id},函数(Snippets){$scope.snippets=片段;});

我之所以解决服务中的承诺,是因为我想保存currentUser并将其放入cookieStore(可能在手机上不可用,但无论如何)。

问题是,通过这样做,我返回的不是promise,而是资源,这迫使我在所有登录调用中传递回调。

有更好的方法吗?

您可以将资源包装在promise中,并返回promise。这应该有效:

var userResource = $resource('/users/:id');
    var currentUser = $cookieStore.get("user") || {};
    return {
        currentUser: currentUser,
        login: function(userId, type, $q) {
            var self = this;
            var deferred = $q.defer();
            // return currentUser if it is present.
            if (this.currentUser.id) {
              return $q.when(this.currentUser);
            }
            userResource.save({id: userId}, {}, function(response) {
              if (!response.error) {
                self.currentUser = response.data;
                $cookieStore.put("user", self.currentUser);
                deferred.resolve(self.currentUser);
              } else {
                deferred.reject(response.error);
              }
            });
          return deferred.promise;
        },
        users: function() {
            return userResource.query();
        }
    };