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

Javascript 在AngularJS中,在控制器之间共享数据并添加用于身份验证的回调行为,javascript,angularjs,Javascript,Angularjs,我目前正在开发一个有角度的前端,试图通过使用breeze或Restanglar来避免使事情过于复杂,但仍然正确地编写代码。 问题是,在只写了几行代码之后,我的代码似乎比其他任何东西都要臃肿 关键是将用户保存在cookie中,并在有人登录时返回它 身份验证服务 var userResource = $resource('/users/:id'); var currentUser = $cookieStore.get("user") || {}; return { c

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

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

身份验证服务

var userResource = $resource('/users/:id'); var currentUser = $cookieStore.get("user") || {}; return { currentUser: currentUser, login: function(userId, type, callback) { var thiz = this; return userResource.save({id: userId}, {}, function(promise) { promise.then(function(result) { thiz.currentUser = result.data; $cookieStore.put("user", thiz.currentUser); if(callback) { callback(thiz.currentUser); } }); }); }, users: function() { return userResource.query(); } }; var userResource=$resource('/users/:id'); var currentUser=$cookieStore.get(“用户”)| |{}; 返回{ currentUser:currentUser, 登录:函数(用户ID、类型、回调){ var thiz=这个; 返回userResource.save({id:userId},{},函数(promise){ 承诺。然后(功能(结果){ thiz.currentUser=result.data; $cookieStore.put(“用户”,thiz.currentUser); 如果(回调){ 回调(thiz.currentUser); } }); }); }, 用户:函数(){ 返回userResource.query(); } }; AuthCtrl控制器

$scope.login = function(userId, type) { Auth.login(userId, type, function(result) { $scope.user = result; }); }; Auth.login("someuser", 'basic', function(result) { $scope.user = result; }); $scope.users = Auth.users(); $scope.login=函数(用户ID,类型){ 身份验证登录(用户ID、类型、函数(结果){ $scope.user=结果; }); }; 身份验证登录(“someuser”,“basic”,函数(结果){ $scope.user=结果; }); $scope.users=Auth.users(); 在另一个控制器中:

$scope.user = Auth.currentUser; Snippets.query({user: $scope.user.id}, function(snippets) { $scope.snippets = snippets; }); $scope.user=Auth.currentUser; Snippets.query({user:$scope.user.id},函数(Snippets){ $scope.snippets=代码段; }); 我在服务中解决承诺的原因是,我想保存当前用户并将其放入cookieStore(手机上可能不提供,但无论如何)

问题是,通过这样做,我没有返回承诺,而是返回资源,这迫使我在所有登录调用中传递回调


有更好的方法吗?

您可以将资源包装成承诺,然后返回承诺。这应该起作用:

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();
        }
    };

您可以将资源包装在承诺中,然后返回承诺。这应该起作用:

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();
        }
    };

我尝试过这种方法,问题是当SnippetCtrl到达时,currentUser是空的SnippetCtrl是部分的吗?如果是,那么您可能需要在到达SnippetCtrl之前解析login?是的,这是一个部分,我希望所有内容都是动态的,这就是为什么我首先要延迟currentUser解析。这样,在这种情况下,在SnippetCtrl中,模板可以像Auth.login那样进行呈现和填充('someUser','basic')。然后(函数(用户){Snippets.query({user:user.id},函数(Snippets){$scope.Snippets=Snippets;});});…是的,重点是避免在每个控制器中写入登录名。我想要的是SnippetCtrl延迟其查询,直到用户的承诺得到解决。我尝试过这种方式,问题是当SnippetCtrl到达时,当前用户是空的SnippetCtrl是部分的吗?如果是,那么您可能需要解决在到达SnippetCtrl之前登录?是的,这是一个部分,我希望一切都是动态的,这就是为什么我首先要推迟当前用户解析。这样,当数据到达时,模板会被呈现和填充。在SnippetCtrl中,您可以像Auth.login('someUser','basic')。然后(function(user){Snippets.query({user:user.id},function(Snippets){$scope.Snippets=Snippets;});});…是的,重点是避免必须在每个控制器中写入登录名。我希望SnippetCtrl将其查询推迟到用户的承诺得到解决。