2015-06-01 64 views
2

我想通過工廠實現Firebase身份驗證,我想將錯誤甚至authData對象從工廠傳回控制器。這可能嗎?我似乎無法弄清楚如何。我一直收到未定義的變量。通過驗證錯誤從工廠到控制器在AngularJS

如果我在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; 
}]); 

回答

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

謝謝@Donal這工作完美。 –

0

也許你可以在你的控制器做到這一點:

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

注意then()需要2個功能參數(一個爲成功和一個錯誤)。這取決於你的Authentication服務如何工作,但它對我來說確實很好。