0

Angularjsを使用する。 Firebase認証イベントが発生して現在のユーザを設定する前に、現在のユーザのuidを使用してコントローラがFirebaseを照会しようとすると、どのようにしてユーザがページを再読み込みする状況に対処しますか?Firebaseの非同期認証をページリロードしてユーザのuidが必要なリストを取得する

詳細: はFirebaseクエリが必要とユーザーのuidだとユーザーのためのコントローラのチェックをルートに移動したときにすべてのものは、$ state.go(「/リスト」)

経由で動作します。しかし、人がページをリロードするときこれは、このイベントハンドラが起動されるまで存在しません:

auth.onAuthStateChanged(function(user) { 
    if (user) { 
     //Set user 
     UserSrvc.currentUser = user; 
    } else { 
     $state.go('/login'); 
    } 
}); 



app.controller('ListCtrl', function($scope, UserSrvc, Posts) { 

    if (!UserSrvc.currentUser){ 
     UserSrvc.getUser(); 
    }; 

    $scope.posts = Posts.list(); <--THIS GENERATES ERROR, SINCE NO USER YET 
}) 

Firebaseはまだ私は、コントローラの先頭にチェックして通話を行うことができますので、これは問題ではないでしょう同期認証コールを持っていた場合。

だから、このような状況に対処するための最良の方法は何

  1. ユーザがログインしていない場合、Posts.list()を実行せずにUserSrvc.getUser()は$ state.go( '/ login')にどのように移動しますか?

答えて

0

これを実装するための一般的な方法はonAuthStateChanged()にポストのロードを移動することである:

app.controller('ListCtrl', function($scope, UserSrvc, Posts) {   
    auth.onAuthStateChanged(function(user) { $timeout(function() { 
    if (user) { 
     UserSrvc.currentUser = user; 
     if (!UserSrvc.currentUser){ 
     UserSrvc.getUser(); 
     }; 

     $scope.posts = Posts.list(); 

    } else { 
     $state.go('/login'); 
    } 
    })}); 
}); 

そうでない角度が認識されませんので、あなたが、私はそこに$timeout()を追加注意しましょう我々は$scopeに更新しました。

私たちには専用のlibrary binding Firebase to AngularJS called AngularFireがありますが、これは自動的に多くのことを行います。

+0

ありがとうございますが、ユーザーが既にログインしてこのルートに移動した場合、どのようにPosts.list()が表示されますか。 auth状態が変更されないので、リストを実行してロードしますか? – neo

+0

'onAuthStateChanged'は、ページをロードするときに現在の状態で起動します。 –

+0

ああありがとう! Btw、あなたが言及したangularFire。私はそれを見て、それも$ getAuth()同期関数を持っていますが、それは非推奨と思われる?それともそれじゃないの?私は物事を行う "ウェブ"の方法を反映した新しい文書を見つけることができないようです。 – neo

関連する問題