我正在尝试通过工厂实现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;
}]);
答案 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
服务如何运作,但对我来说看起来还不错。