javascript - AngularFire - 等到在 Controller 中检索到用户数据

标签 javascript angularjs firebase angularfire firebasesimplelogin

用户使用用户名、电子邮件和密码进行注册。我使用带有电子邮件的 FirebaseSimpleLogin 进行身份验证,获取用户 ID,然后使用用户 ID 加载我的用户:

var ref = new Firebase(FIREBASE_URL + 'users'); // data containing user information
var users = $firebase(ref);

$rootScope.$on('$firebaseSimpleLogin:login', function (e, authUser) { // wait until authenticated
  var query = $firebase(ref.startAt(authUser.uid).endAt(authUser.uid)); // find user by uid
  query.$on('loaded', function () {
    setCurrentUser(query.$getIndex()[0]); // get username from query
  });
});

function setCurrentUser (username) {
  $rootScope.currentUser = User.findByUsername(username);
}

现在,我的问题是,如果我在 HomeCtrl 中登录,我想重定向到用户配置文件页面:

app.controller('HomeCtrl', function ($rootScope, $scope, $location, Auth, User) {
    // wait for current user to be set
    // if signed in
    // location.path('/user/' + currentUser.username);
});

不幸的是,我不确定如何在重定向之前等到 setCurrentUser 函数完成。有没有一种方法可以让我的 Controller 中的一个函数等待其他函数完成?

我有一个解决方法,但我很确定这不是正确的方法。现在,我正在观察我的用户变量是否更新,然后在它更改为用户后调用所有函数,如:

$scope.$watch(
        function() { return $rootScope.currentUser }, // watch for variable to change
        function() {
            if ($rootScope.currentUser) { // if the current user is defined, change path
                $location.path('/users/' + $rootScope.currentUser.username);
            }
        }
    )

最佳答案

尝试为您的用户解析路由。以下面的 plunker demo 为例。

Plunker Demo

该应用只是个人资料页面的简单登录页面。它有一个 HomeCtrl,可在登录后导航到 ResolveCtrl(这是个人资料页面)。

HomeCtrl 只是管理一个登录 View 。当用户成功登录后,我们导航到个人资料页面。 (Auth 对象是我在 Plunker 中提供的自定义包装器)。

.controller('HomeCtrl', function($scope, Auth, $window) {
  $scope.user = {
    email: 'bob@email.com',
    password: 'password'
  };
  $scope.login = function() {
    Auth.login('password', $scope.user);
  };
  
  Auth.onLogin(function(e, user) {
    console.log('logged in!');
    $window.location.href = '#/resolve';
  });
  
})

现在我们已经登录了,我们将使用 ResolveCtrl。该 Controller 在加载之前解析当前用户。那是 data 参数。

.controller('ResolveCtrl', function($scope, $route, data) {
  $scope.user = data;
})

但是那个参数是从哪里来的呢?我们可以在 $routeProvider 中设置一个解析对象。这告诉 ResolveCtrl 在我们解决这个 promise 之前它不能加载。由于 Auth.getCurrentUser() 返回一个 promise ,我们只需要返回它,它就会为我们解决。

.config(['$routeProvider',
  function($routeProvider) {
    $routeProvider
      .when('/', {
        templateUrl: '_home.html',
        controller: 'HomeCtrl',
      })
      .when('/resolve', {
        templateUrl: '_resolve.html',
        controller: 'ResolveCtrl',
        resolve: {
          data: function(Auth) {
           // load the user before the view is loaded
           return Auth.getCurrentUser();
          }
        }
      })
      .otherwise({
        redirectTo: '/'
      });
  }
])

现在,当页面加载时,我们知道用户会在那里。

关于javascript - AngularFire - 等到在 Controller 中检索到用户数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24766428/

相关文章:

javascript - 如何使用 jQuery 将分钟转换为小时/分钟并将各种时间值加在一起?

javascript - 如何在 JavaScript/jQuery 中获取没有重复数字的随机数?

javascript - 相当于AngularJS中的location.href.match

javascript - 使用来自 Javascript 的样式,从带有完成回调的内部指令触发 CSS 转换

Firebase 托管 Webhook

firebase 从远程部署托管(谷歌存储)

javascript - three.js 中 STL 对象的边界框

javascript - CSS 定位适用于 chrome 但不适用于其他浏览器?

javascript - AngularJS 如何在服务和 Controller 之间设置双向数据绑定(bind)

java - Firestore 讲座操作计数