Rest AngularJS控制器/服务/http通信

Rest AngularJS控制器/服务/http通信,rest,angularjs,angularjs-scope,angularjs-service,Rest,Angularjs,Angularjs Scope,Angularjs Service,我已经将RESTAPI封装在一个AnguarJS服务中,该服务被注入控制器。相当标准,对吧。现在,我希望该服务能够截获任何401响应,并以某种方式触发注销或重新登录提示之类的。问题是:该服务无法访问任何作用域。广播该错误的最佳方式是什么?我想出了一些主意,但我对棱角的概念还不太熟悉,我想知道是否有人能告诉我这种“棱角”的方法 1) 我可以让服务充当AppCtrl可以侦听的事件池。但这似乎有点过于复杂。因此: myService.on('logout', function() { $sc

我已经将RESTAPI封装在一个AnguarJS服务中,该服务被注入控制器。相当标准,对吧。现在,我希望该服务能够截获任何401响应,并以某种方式触发注销或重新登录提示之类的。问题是:该服务无法访问任何作用域。广播该错误的最佳方式是什么?我想出了一些主意,但我对棱角的概念还不太熟悉,我想知道是否有人能告诉我这种“棱角”的方法

1) 我可以让服务充当AppCtrl可以侦听的事件池。但这似乎有点过于复杂。因此:

myService.on('logout', function() { 
    $scope.isLoggedIn = false;
});
2) 我可以将$rootScope注入服务,并让服务直接修改
isLoggedIn
。但这似乎完全错了。我希望在服务数据、控制器控制范围和指令与dom冲突的地方保持清晰的区别

3) 我的每个控制器都可以监视被拒绝的承诺,如果原因是401错误,那么就进入$scope并将
isLoggedIn
设置为false,但是这个选项显然很糟糕

有什么帮助吗


谢谢。

我们需要沟通三个方面;你已经知道有一个控制器在那里进行ngSwitch,还有一个API服务。第三种是用于管理用户信息的某种类型的用户状态服务。这种类型的服务在AngularJS应用程序中非常常见。请参阅,了解该服务的外观

您的API服务将在401上告诉该服务我们当前已注销。您也可以为此使用通用的
$http
拦截器,但它会影响所有
$http
调用。这是你的选择

然后,控制器只需监视当前状态:

$scope.$watch(AuthService.isLoggedIn,函数(isLoggedIn){
$scope.isLoggedIn=isLoggedIn;
});
您的模板可以在该范围变量上使用ngShow:


...
此服务也可供任何需要它的控制器使用。如果我们事先知道用户没有登录,您的API服务甚至可以在发出任何请求之前检查该值,以防止任何不必要的API调用


根据应用程序的结构和现有代码,这方面的变化数不胜数,但希望这将使您走上正确的道路。

注销操作需要从哪里开始?如何向用户显示登录表单或通知用户?有重定向吗?@JoshDavidMiller这是个好问题。这应该发生在哪里。整个程序只有一页,所以没有重定向。我想象着作用域上有一个
isLoggedIn
变量,控制
ngSwitch
或显示应用程序或登录屏幕的东西。这有意义吗?