3

我已经将我的 REST API 封装在一个注入控制器的 AnguarJS 服务中。很标准,对。现在我希望该服务拦截任何 401 响应并以某种方式触发注销或重新登录提示或其他内容。问题是:该服务无权访问任何范围。广播该错误的最佳方法是什么?我提出了一些想法,但我是 Angular 的新手,想知道是否有人可以告诉我这样做的“Angular”方式?

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

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

2)我可以将 $rootScope 注入服务,并直接修改服务isLoggedIn。但这似乎完全是错误的。我想明确区分服务服务数据、控制器控制范围以及指令与 dom 混在一起的地方。

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

有什么帮助吗?

谢谢。

4

1 回答 1

4

我们需要三个组件来进行交流;你已经知道有发生 ngSwitch 的控制器和 API 服务。第三个是您用来管理用户信息的某种类型的用户状态服务。这种类型的服务在 AngularJS 应用程序中很常见。请参阅此答案以了解该服务的外观。

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

然后你的控制器只需要观察这个当前状态:

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

您的模板可以在该范围变量上使用 ngShow:

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

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

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

于 2013-04-02T21:27:43.567 回答