AngularJS控制器/服务/ http通信

时间:2013-04-02 17:49:37

标签: rest angularjs angularjs-scope angularjs-service

我已经在一个注入控制器的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>

任何帮助?

感谢。

1 个答案:

答案 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调用。

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