2014-10-17 2 views
0

Я создаю угловое приложение + firebase с аутентификацией пользователя (с угловым огнем 0.8).

Мне нужно использовать обработчик событий onAuth() auth, так как я предоставлю несколько путей аутентификации, включенных в социальные сети и хочу избежать дублирования кода. Внутри обратного вызова onAuth мне нужно сбросить location.path на '/'.

Обычно все работает хорошо, но, если загружается приложение на уже авторизованной сессии (<F5>, к примеру), на $scope.$apply() я получаю «Ошибка: [$ rootScope: inprog] $ применять уже в процессе "
(если я не использую $ scope. $ Apply(), путь местоположения не применяется к области видимости, и изменение страницы не происходит).

Я подозреваю, что я делаю некоторые глупые ошибки, но не может определить его ...

Это мой рабочий процесс:

app.controller('AuthCtrl', function ($scope, $rootScope, User) { 
    var ref = new Firebase(MY_FIREBASE_URL); 
    $scope.init = function() { 
    $scope.users = []; 
    User.all.$bindTo($scope, 'users').then(function() { 
     console.info('$scope.users bound:', $scope.users); 
    }); 
    }; 
    $scope.login = function() { 
    ref.authWithPassword({ 
     email: $scope.user.email, 
     password: $scope.user.password, 
    }, function(err) { 
     if (err) { 
     console.error('Error during authentication:', err); 
     } 
    }); 
    }; 

    ref.onAuth(function(authData) { 
    if (authData) { 
     console.info('Login success'); 
     var $rootScope.currentUser = $scope.users[authData.uid]; 
     $location.path('/'); 
     $scope.$apply(); 
    } else { 
     console.info('Logout success'); 
    } 
    }); 
}; 

app.factory('User', function ($firebase) { 
    var ref = $firebase(new Firebase(MY_FIREBASE_URL + 'users')); 
    return { 
    all: ref.$asObject() 
    }; 
}); 
+0

Эй, Марко, я вижу, у вас была аналогичная проблема с моей. Не могли бы вы взглянуть на мой вопрос: http://stackoverflow.com/questions/31872935/firebase-authwithoauthredirect-doesnt-call-onauth-without-page-refresh – Nikola

+0

Я сделал, но вы совсем другом (Ionic/Angular + Firebase) ... И, извините, я не использую Angular с нескольких месяцев (просто жду 2.0 ... :-), поэтому я действительно не могу вам помочь ...: - ( – MarcoS

+0

Спасибо за ответ. Мне удалось решить эту проблему. – Nikola

ответ

1

Подобно тому, как ссылки, я хочу опубликовать решение, которое я нашел и я в настоящее время принятия:

$scope.init = function() { 
    $scope.params = $routeParams; 
    $scope.debug = CFG.DEBUG; 
    $scope.lastBuildDate = lastBuildDate; 
    $scope.error = null; 
    $scope.info = null; 

    $scope.users = []; 

    User.all.$bindTo($scope, 'users').then(function() { 
     // watch authentication events 
     refAuth.onAuth(function(authData) { 
     $scope.auth(authData); 
     }); 
    }); 

    ... 
    }; 
    ... 

то есть, это было достаточно, чтобы переместить часы на событиях аутентификации внутри обратного вызова для bindTo на пользователях объект от Firebase.

Смежные вопросы