2013-04-02 75 views
3

我在一個AnguarJS服務中封裝了我的REST API,該服務被注入控制器。相當標準,對。現在我希望該服務攔截任何401響應,並以某種方式觸發註銷或重新登錄提示或其他內容。問題是:該服務無法訪問任何範圍。播放該錯誤的最佳方式是什麼?我提出了一些想法,但是我對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調用,如果我們有先驗知識的用戶沒有登錄前檢查值。

有關於這一點,取決於您的應用程序的結構無數的變化和你現有的代碼,但希望這會讓你在正確的道路上。