javascript – 在创建$http拦截器作为独立模块时Angular中的依赖性错误

这是一个工作示例,说明我如何设置拦截器,为每个请求附加一个身份验证令牌(这或多或少是来自 https://docs.angularjs.org/api/ng/service/ $http的示例)
angular.module("app",[])
.config(function ($httpProvider) {
  $httpProvider.interceptors.push("authInterceptor");
})
.factory("authInterceptor",function ($q) {
  return {
  // interceptor configuration here
  }
})

我的配置中有很多其他东西,并且运行块来调用和启动来自不同角度模块的服务,所以我想稍微整理一下.但是我知道在配置块中有一些非常具体的依赖注入规则,我不太明白,这些阻止我在一个单独的模块中定义我的authInterceptor工厂.由于配置和运行块中的其他逻辑调用应用程序中的其他模块,因此声明拦截器在那里看起来不合适.

这就是我想要做的:

angular.module("services.authInterceptor",[])
.factory("authInterceptor",function ($q) {
  return {
  // interceptor configuration here
  }
});

angular.module("app",[
 "services.authInterceptor"
]).config(function ($httpProvider,authInterceptor) {
  $httpProvider.interceptors.push("authInterceptor");
});

// Error: Unknown provider authInterceptor.

我尝试将它注入运行块,但我猜你不允许在那里注入$httpProvider:

angular.module("app",[
  "services.authInterceptor"
]).run(function ($httpProvider,authInterceptor) {
  $httpProvider.interceptors.push("authInterceptor");
});

// Error: Unknown provider: $httpProviderProvider <- $httpProvider

我应该在哪里注入模块,以便$httpProvider也可以注入,我应该在哪里添加拦截器到现有的?我的主要目标是将拦截器和其他类似服务保存在自己的自包含模块中.

编辑

我得到一个不同的错误,当我宣布一个提供者而不是工厂时,似乎让我更接近(出于某种原因,我一直认为这些是可以互换的):

angular.module("services.authInterceptor")
.provider("authInterceptor",function ($q) {
  return {}
})

// Error: Unknown provider: $q

所以它现在成功地将authInterceptor注入我的配置块,但在尝试查找$q时失败.

解决方法

在配置阶段,只能注入提供者和常量.这是为了防止服务在完全配置之前进行实例化.

这就是您按名称注册拦截器的原因(将名称作为字符串推入$httpProvider.interceptors数组).它们将在运行时稍后解析.

这正是您在工作示例中所做的,以及您在第二步中需要做的事情,即使拦截器在另一个模块中:

angular.module("services.authInterceptor",["services.authInterceptor"])
.config(function ($httpProvider) {
  $httpProvider.interceptors.push('authInterceptor');
});

演示:http://plnkr.co/edit/A8SgJ87GOBk6mpXsoFuZ?p=preview

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)