在AngularJS中将验证错误从工厂传递到控制器

时间:2015-06-01 01:02:36

标签: angularjs

我正在尝试通过工厂实现Firebase身份验证,我想将错误甚至authData对象从工厂传回控制器。这可能吗?我似乎无法弄清楚如何。我一直得到未定义的变量。

如果我在登录console.log失败时打印错误,我会得到预期的内容,因此其余代码可以正常工作。我只是无法将错误/ obj传递回控制器。

我的控制器:

myApp.controller('LoginController', ['$scope', '$location', 'Authentication', function($scope, $location, Authentication) {
 $scope.login = function() {
    Authentication.login($scope.user);
    // do something with error from auth factory
 }
}]);

我的工厂:

myApp.factory('Authentication', ['$firebase', 'FIREBASE_URL', '$location', function($firebase, FIREBASE_URL, $location){
 var ref = new Firebase(FIREBASE_URL);
 var authObj = {
    login: function(user) {
        return ref.authWithPassword({
            email    : user.email,
            password : user.password
        }, function(error, authData) {
            if (error) {
                // pass error back to controller
                // i've tried the following:
                // authObj.err = error;
                // return authObj.err = error;
            }
            else {
                // pass authData back to controller
            }
        });
    } // login
  };

  return authObj;
}]);

2 个答案:

答案 0 :(得分:1)

您只需从控制器将错误处理函数传递给工厂。像这样(未经测试):

//Controller
myApp.controller('LoginController', ['$scope', '$location', 'Authentication', function($scope, $location, Authentication) {
 $scope.login = function() {
    Authentication.login($scope.user, function(error, authData) {
            // access to error
        });
 }
}]);


//Factory
myApp.factory('Authentication', ['$firebase', 'FIREBASE_URL', '$location', function($firebase, FIREBASE_URL, $location){
 var ref = new Firebase(FIREBASE_URL);
 var authObj = {
    login: function(user, errorHandler) {
        return ref.authWithPassword({
            email    : user.email,
            password : user.password
        }, errorHandler);
    } // login
  };

  return authObj;
}]);

答案 1 :(得分:0)

也许你可以在控制器中执行此操作:

$scope.login = function() {
    Authentication.login(username, password).then(
        function(result) {
            $location.path('/stuff');
        },
        function(result) {
            $scope.showLoginErrorMessage = true;
        });
};

请注意then()将2个函数作为参数(一个用于成功,一个用于错误)。这取决于您的Authentication服务如何运作,但对我来说看起来还不错。