Функция CreateUser не работает в AngularFire — простой вход в Firebase?

#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: Да, ошибка все еще там. Ага.