3

ユーザーは、ユーザー名、電子メール、およびパスワードで登録します。メールで 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 関数が完了するまで待つ方法がわかりません。この他の関数が完了するまでコントローラーの関数を待機させる方法はありますか?

回避策はありますが、これは正しい方法ではないと確信しています。現在、ユーザー変数が更新されるのを監視し、次のように、ユーザーに変更された後にすべての関数を呼び出しています。

$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);
            }
        }
    )
4

1 に答える 1

4

ユーザーのルートを解決してみてください。以下のプランカーのデモを例にとります。

プランカーデモ

このアプリは、プロフィール ページへの単純なログイン ページです。ログイン後に (プロファイル ページ) にHomeCtrl移動する があります。ResolveCtrl

HomeCtrl、ログイン ビューを管理するだけです。ユーザーが正常にログインすると、プロファイル ページに移動します。(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. このコントローラーは、ロードされる前に現在のユーザーを解決します。それが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: '/'
      });
  }
])

ページが読み込まれると、ユーザーがそこにいることがわかります。

于 2014-07-15T23:23:23.860 に答える