AngularFire:如何在onAuth()中设置$ location.path?

时间:2014-10-17 13:19:48

标签: angularjs firebase angularfire

我正在使用用户身份验证构建angular + firebase应用程序(使用angularfire 0.8)。

我需要使用onAuth()auth事件处理程序,因为我将提供多个身份验证路径,包括社交,并希望避免代码重复。在onAuth回调中,我需要将location.path重置为' /'。

通常一切都运行良好,但是,如果在已经过身份验证的会话中加载应用程序(例如,< F5> ),则在$scope.$apply()上我得到&#34 ;错误:[$ 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()
  };
});

1 个答案:

答案 0 :(得分: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);
      });
    });

    ...
  };
  ...

即,将来自回调内部的身份验证事件的监视移动到来自Firebase的用户对象上的bindTo就足够了。