gpt4 book ai didi

rest - AngularJS Controller /服务/http 通信

转载 作者:行者123 更新时间:2023-12-01 12:46:08 25 4
gpt4 key购买 nike

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

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

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

2) 我可以将 $rootScope 注入(inject)到服务中,并让服务直接修改 isLoggedIn。但这似乎完全错误。我想明确区分服务服务数据、 Controller 控制范围和指令与 dom 的区别。

3) 我的每个 Controller 都可以监视被拒绝的 promise ,如果原因是 401 错误,则到达 $scope 并将 isLoggedIn 设置为 false,但这个选项很糟糕,显然。

有什么帮助吗?

谢谢。

最佳答案

我们需要三个组件来进行通信;您已经知道 ngSwitch 所在的 Controller 和 API 服务。第三种是用于管理用户信息的某种用户状态服务。这种类型的服务在 AngularJS 应用程序中很常见。参见 this answer 以了解该服务的外观。

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

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

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

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

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

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

根据您应用的结构和现有代码,这方面有无数变体,但希望这能让您走上正确的道路。

关于rest - AngularJS Controller /服务/http 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15770803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com