4

現在、私は、angelfireを使用してユーザーのログイン/ログアウト状態を追跡する認証システムを持っています。私が見ているガイドでは、すべてのコントローラで$ onAuthStateChangedを使用することを提案しています。

$rootScope.authObj.$onAuthStateChanged(function(firebaseUser) { 
    if (firebaseUser) { 
     console.log("Signed in as:", firebaseUser.uid); 
     }); 
    } else { 
     console.log("Signed out"); 
    } 
    }); 

代わりに、現在ログインしているユーザーを追跡するために$ rootScope.session変数を使用しています。これは大部分ではうまくいくが、オブジェクトがその時点でインスタンス化されていないので、他のコントローラの開始時にこのセッション変数にアクセスすることはできない。コントローラのスコープ内でこのセッション変数にアクセスするためのきれいな方法があるので、(それぞれの関数がセッション変数が設定された後に呼び出されるので)各関数のデータベースへの新しい参照を作成する必要はありません。

物事をもう少し明確にする。

ref = firebase.database().ref("users/" + $rootScope.session.id + '/meetings'); 
list = $firebaseArray(ref); 

$ rootScope.session.idはまだ設定されていないため、コントローラの上部に表示されません。

しかし

$scope.addMeeting = function() { 
    ref = firebase.database().ref("users/" + $rootScope.session.id + '/meetings'); 
    list = $firebaseArray(ref); 
    list.$add({ 
     name: $scope.meetingname, 
     date: firebase.database.ServerValue.TIMESTAMP 
    }); 

};

ボタンがクリックされたときに呼び出される関数として機能します。これは、ページが既に読み込まれた後になるため、その時点で$ rootScope.session.idが設定されます。

-------------私が提案firebasesを使用して動作するようにそれを得ているアップデート-----------------

方法論、しかしそれはかなり見えません。 firebaseのAuthオブジェクトのリスナー内にすべてをネストし、if文を使用してユーザオブジェクトがnullでないことを確認します。それはあなたがあなたのページを更新するたびにクリーンアップされますので、

myApp.controller('MeetingsController', ['$scope', '$rootScope', '$firebaseAuth', '$firebaseArray', function($scope, $rootScope, $firebaseAuth, $firebaseArray){ 

    var authObj = $firebaseAuth(); 
    authObj.$onAuthStateChanged(function(firebaseUser) { 

    if (firebaseUser) { 
     var ref = firebase.database().ref("users/" + firebaseUser.uid + '/meetings'); 
     var meetings = $firebaseArray(ref); 

     $scope.addMeeting = function() { 
     meetings.$add({ 
      name: $scope.meetingname, 
      date: firebase.database.ServerValue.TIMESTAMP 
     }); 
     }; 

     $scope.deleteMeeting = function(key) { 
     meetings.$remove(meetings.$getRecord(key)).then(function(ref) { 
     }) 
     .catch(function(error){ 
      console.log(error); 
     }); 
     }; 
    } 
    }); //onAuthStateChange 

}]); 

答えて

2

$rootScopeは、ストレージのこの種の不正なオプションです。

あなたはngStorageを見てください。 $localStorage$sessionStorageが付属していますので、あなたのニーズに合ったものをお読みください。

次に、ngStorageをモジュールに追加し、コントローラに$localStorageを注入します。

$localstorage.sessionId = id; 

これにより、ブラウザにIDが保存されます。

+0

おかげで、私はこれを試してみますよ! – user3225440

2

angelfireはあなたのセッションを追跡し、現在のユーザー情報を維持します。各状態の解決で認証を確認している場合は、認証されたユーザーを各コントローラに渡すことができます。ローカルのストレージは、基本的なFirebase SDKが処理しているため、必要ありません。

使用しているガイドに関する追加情報を提供すると便利です。

このドキュメントここhttps://github.com/firebase/angularfire/blob/master/docs/guide/user-auth.md#authenticating-with-routersは古いですが、パターンがまだ認証プロパティを格納するためのファクトリを作成し効果的

+0

私はLynda.comとfirebase/angularfireのドキュメントを使用しています。どちらのリソースも、$ firebaseAuthを使用し、リスナーを使用して権限オブジェクトが変更されたかどうかを確認する傾向があります。それは動作しますが、それは醜いように見えます。私は、リスナー内とif文(if文が現在のユーザがログインしているかどうかをチェックする)の中で、ほとんどすべての機能をネストしなければならないというファンではありません。 – user3225440

+0

古いバージョンのFireWireを使用しているようですが、最新バージョンのFirebase –

0

使用することができます。このようなもの。その後、

 app.factory('authService', function(){ 
     return{ 
     authenticated: false 
     }; 
    }); 

とコントローラでそれを確認してください。

$scope.authenticated = authService.authenticated; 

希望、これは何とか

PSコントローラのみを表示するためにモデルを表示するために使用し、任意の機能は、別のディレクティブに移動しなければならないのに役立ちますかサービス。あなたのコントローラは、将来クリーンアップが必要です。

関連する問題