Привязка сообщения angularjs не отображается до отправки второй формы

Я пишу свое первое приложение angularjs, и оно начинает обретать смысл. Тем не менее, у меня есть форма регистрации, которая в некоторых случаях не получает сообщения для предупреждения пользователей о проблемах. Я использую Firebase для проверки подлинности, которая отлично работает. Но я храню пользователей с уникальным именем пользователя в качестве ключа. Так что, прежде чем я бегу $createUser Функция, я делаю быстрый запрос, чтобы увидеть, есть ли уже пользовательский объект с этим ключом - если нет, я создаю пользователя.

Проблема в том, что существует существующий пользователь с таким именем. Значение журнала консоли печатается нормально, но сообщение об ошибке (привязано к $scope.authMsg) не появляется в первый раз - но если я снова нажму кнопку "зарегистрироваться", то сообщение появится в ожидаемом сообщении div.

Будем благодарны за любые подсказки по проблеме сообщения (или предложения по этому коду)!

$scope.register = function() {
    $scope.authMsg = '';
    var ref = new Firebase(FIREBASE_URL);
    $scope.authObj = $firebaseAuth(ref);

    // check if the username is taken
    ref.child("/users/"+$scope.account.username).on("value", function(snapshot) {
        if (snapshot.val()) {
            //
            // PROBLEM HERE!!
            //
            $scope.authMsg = 'Username exists-- did you forget your password?'; // doesn't show on page until second submit
            console.log('Username exists-- did you forget your password?'); // prints to console as expected
        } else {
            $scope.authObj.$createUser({ email: $scope.account.email, password: $scope.account.password })
            .then(function(userData) {
                console.dir(userData);
                return $scope.authObj.$authWithPassword({
                    email: $scope.account.email,
                    password: $scope.account.password
                });
            }).then(function(authData) {
                // we created a user and are now logged in-- store user info
                var userdata = {};
                userdata[$scope.account.username] = {
                                uid: authData.uid,
                                first_name: $scope.account.first_name,
                                last_name: $scope.account.last_name,
                                email: $scope.account.email,
                                full_name: $scope.account.first_name+' '+$scope.account.last_name
                            };
                var usersRef = ref.child("users");
                // save the userdata
                usersRef.set(userdata);
                console.log("Logged in as:", authData.uid);
                $state.go('app.dashboard');
            }).catch(function(error) {
                $scope.authMsg = error;
                console.error("Error: ", error);
            });
        }
    }, function (errorObject) {
        $scope.authMsg = 'The read failed: ' + errorObject.code;
        console.log('The read failed: ' + errorObject.code);
    });
};

1 ответ

Решение

Я предполагаю, что обратный вызов Firebase не включает в себя угловой цикл дайджеста.

Чтобы справиться с этим, напишите

if (snapshot.val()) {
    $scope.$apply(function() {
        $scope.authMsg = 'Username exists— did you forget your password?';
    });

Полезное чтение по теме: http://jimhoskins.com/2012/12/17/angularjs-and-apply.html

Другие вопросы по тегам