我已经在一个注入控制器的AnguarJS服务中包装了我的REST API。很标准,对。现在,我希望该服务拦截任何401响应,并以某种方式触发注销或重新登录提示等。问题是:该服务无权访问任何范围。广播该错误的最佳方式是什么?我想出了一些想法,但我是Angular的新手,我想知道是否有人能告诉我“Angular”这样做的方式?
1)我可以让服务充当我的AppCtrl可以收听的事件池。但这似乎有点过于复杂。所以:
myService.on('logout', function() {
$scope.isLoggedIn = false;
});
2)我可以将$ rootScope注入服务,并让服务直接修改isLoggedIn
。但这似乎是完全错误的。我想明确区分服务服务数据,控制器控制范围以及指令与dom的混乱。
3)我的每个控制器都可以监视被拒绝的承诺,如果原因是401错误,那么达到$ scope并将isLoggedIn
设置为false,但这个选项显然很糟糕。 / p>
任何帮助?
感谢。
答案 0 :(得分: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调用。
这里有无数的变化取决于你的应用程序的结构和你现有的代码,但希望这会让你走上正确的道路。