#firebase #angularfire #firebasesimplelogin
#firebase #angularfire #firebasesimplelogin
Вопрос:
У меня есть следующий контроллер, который использует AngularFire
app.controller("authController", function($scope, $firebaseSimpleLogin){
var ref = new Firebase("https://myapp.firebaseIO.com/");
$scope.auth = $firebaseSimpleLogin(ref, function(error, user){
if(error){
console.log(error);
}
else if(user){
console.log(user);
}
else{
console.log("user logged out");
}
});
// This shows a valid object
console.log($scope.auth);
$scope.createAccount = function(){
console.log("found me");
$scope.auth.$createUser($scope.email, $scope.password, function(error, user){
console.log("something");
console.log(user);
if(!error){
console.log(user);
}
else{
console.log(error);
}
});
};
});
Когда я привязываю $scope.createAccount
функцию к ng-click
событию и нажимаю на кнопку привязки, console.log("found me")
запускается в браузере, но ни одна из других console.log
команд в $scope.createAccount
не отображается.
console.log($scope.auth)
Команда, которую я выполняю перед настройкой $scope.createAccount
функции, показывает допустимый объект с определенной $createUser
функцией.
Я не получаю никаких консольных ошибок при запуске $scope.createAccount
поэтому я предполагаю, что вызов был «успешно» выполнен.
Почему я могу видеть объект аутентификации, но не получаю обратный вызов после вызова $createUser
?
Ответ №1:
Это происходило потому, что я выполнял обратные вызовы на основе нотации JavaScript вместо нотации Angular. Поскольку я использовал методы AngularFire (они имеют те же имена, что и методы ванильного JavaScript SDK, но со $
знаком перед ними), мне нужно было обрабатывать обратные вызовы, используя $promise
методологию Angular.
Я изменил
$scope.auth.$createUser($scope.email, $scope.password, function(error, user){
// do things;
});
Для
$scope.auth.$createUser($scope.email, $scope.password)
.then(function(user){
// do things if success
}, function(error){
// do things if failure
});
и обратный вызов сработал, как ожидалось.
Существует исключение из приведенного выше с ванильным firebaseSimpleLogin
конструктором JS против конструктора Angular $firebaseSimpleLogin
. В конструкторе vanilla JS есть обратные вызовы в конструкторе, который позволяет вам указать, что должен делать ваш скрипт, когда пользователь входит в систему / выходит из системы. Он соответствует следующему формату:
var auth = new firebaseSimpleLogin(ref, function(error, user){
if(error){
// do things if login failure
}
else if(user){
// do things when login succeeds
}
else{
// do things when user logs out
}
});
Если вы попытаетесь сделать то же самое с конструктором Angular вот так:
$scope.auth = $firebaseSimpleLogin(ref)
.then(function(user){
// do things when login succeeds
}, function(error){
// do things when login fails
});
вы получите сообщение об ошибке. В конструкторе Angular нет методов обратного вызова. Я предполагаю, что это было сделано специально, поскольку с Angular у вас есть привязка к данным, и вы можете просто $watch
$scope.auth.user
вносить изменения и выполнять операции в своем приложении в зависимости от состояния переменной. Когда $scope.auth.user
установлено значение null
, пользователь выходит из системы. Если значение установлено на что-либо иное, чем null
, то пользователь вошел в систему.
Комментарии:
1. По состоянию на 31.12.2014 по-прежнему существует ошибка в методе $CreateUser. Смотрите github.com/firebase/angularfire/issues/507
2. @RonHarlev: Да, ошибка все еще там. Ага.