2013-04-02 76 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调用,如果我们有先验知识的用户没有登录前检查值。

有关于这一点,取决于您的应用程序的结构无数的变化和你现有的代码,但希望这会让你在正确的道路上。