4

현재 저는 angularfire를 사용하여 사용자 로그인/로그 아웃 상태를 추적 할 수있는 인증 시스템을 보유하고 있습니다. 내가보고있는 가이드는 모든 컨트롤러에서 $ 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

angularfire는 현재 세션을 추적하고 현재 사용자 정보를 유지합니다. 각 주정부의 해결을 위해 인증을 확인하는 경우 인증 된 사용자를 각 컨트롤러에 전달할 수 있습니다. 기본 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

두 버전의 구버전을 사용하고있는 것처럼 보입니다 ... Firebase의 최신 버전으로 업그레이드하는 것이 좋습니다. –

0

는 인증 등록 정보를 저장하기 위해 공장을 생성 할 수 있습니다. 이 같은.

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

다음 컨트롤러에서 확인 :

$scope.authenticated = authService.authenticated; 

희망이 어떻게 든에만 볼 수 모델을 표시하는 데 사용

PS 컨트롤러를하는 데 도움이 모든 기능은 별도의 지시 또는 이동해야한다 서비스. 나중에 컨트롤러를 정리해야합니다.