在Angular中禁用/删除http拦截器的正确方法?

Ric*_*ral 12 angularjs angular-http-interceptors

我按照这篇文章在项目上实现了类似的ajax loader映像:

我的实现有一些不同之处:

  • 我用的$rootScopeemit,而不是broadcast和我也用$rootScope的指令来处理该事件.
  • 由于项目的特殊性,我必须$rootScope.$on在事件处理程序内第一个被触发的事件(显示或隐藏)之后解除指令侦听器的绑定.
  • 我只发射一个显示/隐藏事件.在第一个HTTP请求上显示,在计数达到0时隐藏.

我认为这些是与链接帖子的主要区别,不确定它们是否与我的问题相关,但以防它们是......

处理加载程序隐藏事件时,加载程序已经消失,除非刷新页面,否则我不会再显示它,但我仍然有后台http请求刷新当前页面上的数据.这些请求仍然会被截获并触发新的显示/隐藏事件,这些事件不再需要/处理.我只需要第一次秀和第一次隐藏,就是这样.

什么是删除我$httpProvider在第一个隐藏事件被触发后添加到的HTTP拦截器的正确方法?

我知道我们使用a添加了拦截器,$httpProvider.interceptors.push()但是当我不再需要拦截器时,我不知道如何将其弹出.

小智 3

我打算为此悬赏,因为我也有同样的问题。然而...根据源代码(工厂中的第 127 行和第 133 行),interceptors和看起来好像只是数组。对此没有包装。responseInterceptors$httpProvider

据我所知,您要么必须使用pop()或任何其他数组方法。然而,这意味着您不知道自己在弹出什么!持有对对象的引用并没有真正的帮助,因为你不能真正对其执行数组函数,除非你决定基于相等进行迭代(这可以工作,使用indexOf或其他类似Underscore的东西)。

实际上,Angular 需要的是一个包装器,因为您无法确定您的拦截器是列表中的最后一个。

  • @LarsJuelJensen 这也许是可能的。您必须在其他地方保存对该对象的引用才能使其工作。使用闭包,您可以在为“$get”传递的函数内配置一个标志,如果它设置为 true,则执行 noop。 (3认同)
  • @John-Philip 是的,似乎一旦 Angular 启动,改变配置就成为了禁忌。弹出拦截器将不起作用,因为 Angular 已经提供了服务(使用“$get”),因此配置已被播种。 (2认同)