2013-04-02 7 views
3

저는 컨트롤러에 주입되는 AnguarJS 서비스에서 REST API를 마무리했습니다. 꽤 표준 맞아. 이제는 그 서비스가 어떤 401 응답도 가로 채고 어떤 식 으로든 로그 아웃이나 재 로그인 프롬프트를 트리거하고 싶습니다. 문제는 서비스가 모든 범위에 액세스 할 수 없다는 것입니다. 그 오류를 방송하는 가장 좋은 방법은 무엇입니까? 저는 몇 가지 아이디어를 생각해 냈습니다. 그러나 Angular에 익숙하지 않은 사람이라면 누구나 저에게 "Angular"방식으로 이것을 말할 수 있는지 궁금해하고 있습니까?AngularJS 컨트롤러/서비스/http 통신

1) 내 AppCtrl이들을 수있는 이벤트 풀로 서비스 작업을 할 수 있습니다. 그러나 이것은 약간 지나치게 복잡해 보입니다. 그래서 :

myService.on('logout', function() { 
    $scope.isLoggedIn = false; 
}); 

2) 서비스에 $의 rootScope를 주입하고, 서비스가 직접 isLoggedIn을 수정할 수 있습니다. 그러나 이것은 단지 틀린 것처럼 보입니다. 서비스 서비스 데이터, 컨트롤러가 범위를 제어하고 dom과 함께 명령을 내리는 경우를 명확하게 구분하고 싶습니다.

3) 내 컨트롤러 하나 하나가 거부 된 약속을 볼 수 있으며 이유가 401 오류 인 경우 $ 범위에 도달하여 isLoggedIn을 false로 설정합니다.하지만이 옵션은 분명히 당황 스럽습니다.

어떤 도움이 필요합니까?

감사합니다.

+0

어디에서 로그 아웃 작업을 수행해야합니까? 사용자에게 로그인 양식이 표시되거나 알림을받는 방법은 무엇입니까? 리디렉션이 있습니까? –

+0

@JoshDavidMiller 좋은 질문입니다. 어디서 그런 일이 일어나야합니다. 모든 것은 한 페이지 앱이므로 리디렉션이 없습니다. 나는'ngSwitch' 또는 앱이나 로그인 화면을 보여주는 것을 제어하는 ​​스코프에'isLoggedIn' 변수를 상상하고 있습니다. 말이 돼? – nicholas

답변

4

의사 소통을 위해 필요한 세 가지 구성 요소가 있습니다. 이미 ngSwitch가 발생하는 컨트롤러가 있고 API 서비스가 있다는 것을 이미 알고 있습니다. 세 번째는 사용자 정보를 관리하는 데 사용하는 사용자 상태 서비스 유형입니다. 이러한 유형의 서비스는 AngularJS 앱에서 매우 일반적입니다. 서비스가 어떻게 보이는지에 대한 아이디어는 this answer을 참조하십시오.

API 서비스는 401에서 현재 로그 아웃중인 서비스를 알립니다. 이 경우 일반 $http 인터셉터를 사용할 수도 있지만 모두$http 호출에 영향을줍니다. 여기에서 선택하십시오.

귀하의 컨트롤러 만이 현재 상태를 감시 할 수 있습니다

$scope.$watch(AuthService.isLoggedIn, function (isLoggedIn) { 
    $scope.isLoggedIn = isLoggedIn; 
}); 

그리고 그 범위 변수에 ngShow를 사용할 수있는 템플릿이 :

<div class="login" ng-show="!isLoggedIn"> 
    ... 
</div> 

이 서비스는 컨트롤러로도 사용할 수 있음 그것을 필요로합니다. 사용자가 로그인하지 않은 사전 지식 지식이있는 경우 API 서비스는 불필요한 API 호출을 방지하기 위해 요청을하기 전에 값을 확인할 수도 있습니다.

앱의 구조에 따라 다양한 변형이 있습니다. 귀하의 기존 코드를 사용 하시길 바랍니다.하지만 이것이 올바른 길로 인도 할 수 있기를 바랍니다.