使用angular.js阻止/初始化服务

时间:2016-08-25 17:12:31

标签: angularjs

我的应用在Intranet上使用了很多Web服务,而url-s则依赖于服务器环境。

我的应用程序托管在IIS上,它会添加如下所示的HTTP响应标头:Environment: DEV,因此每个Web应用程序都知道它在哪个服务器环境中运行,因此必须使用哪个内部网服务器来调用所有服务。

我的每个角度应用都使用一种服务,该服务会针对应用程序自己的root发出简单的GET,以获取其中包含环境名称的任何响应,并相应地设置配置。

问题:

角度应用程序应该如何实现这样一个服务,它将作为应用程序中的第一件事执行,并确保在获得第一个响应时,应用程序中的任何内容都不会尝试对其他服务执行HTTP请求,甚至尝试使用我的环境服务提供的任何配置?

有没有办法以角度实现这样的服务,可以阻止应用程序中的每个其他服务/工厂,直到它自己初始化为止?

我在应用程序中有很多其他服务,在我的环境服务完成初始化之前,他们都不知道该怎么做。

更新

从另一个角度来看....是否有可能以角度实现这样的拦截器,可以执行以下操作?:

  • 执行HTTP请求并阻止应用程序执行,直到收到回复
  • 将整个应用程序中的响应信息作为服务/工厂/配置提供。

1 个答案:

答案 0 :(得分:1)

角度生命周期可能是一种解决方案。使用angular.config()阶段,您可以查看HTTP服务的标头。

创建一个名为' httpInterceptor'

的工厂
function httpInterceptors(siteConfig, $q, $injector) {
    return {
        response: function(data, status, headers) {
            siteConfig.setEnvironment(headers['Environment']);
            return data;
        }
    };
)

然后在angular.config()

$httpProvider.interceptors.push('httpInterceptor');

如果你真的想要阻止另一个选择是使用UI路由器解析属性来阻止路由加载,直到请求被发送https://github.com/angular-ui/ui-router/wiki,你可以将解析方法添加到根状态。

  

解决

     

您可以使用resolve为控制器提供>内容或数据。是国家的习惯。 resolve是依赖关系的可选映射,其>应该注入控制器。

     

如果这些依赖项中的任何一个是promise,它们将在实例化控制器并触发$ stateChangeSuccess事件之前被解析并转换为值。