用于资源成功查询的Angular JS全局配置

时间:2014-09-25 13:29:00

标签: angularjs http-headers angularjs-resource

我已在我的单页角应用程序中实现了资源,该应用程序将激活到我的REST客户端服务器。我为每个资源提供了不同的服务。现在我的REST服务器正在响应头中发送一个值,现在我想知道一种正确的方法,我可以从头中检索该值。

我的服务代码:

app.service('$job', function($resource) {
    var job = $resource(service_base_url+'jobs.json/:id');
    return job;
});

我的控制器正在获取标题:

app.controllerProvider.register('JobPostsController',['$scope','$job', function($scope, $job) {
    $scope.jobs = {};
    $scope.job_titles = {};
    $job.query(function(jobs,responseHeaders){
        var headers = responseHeaders();
        some_function(headers.user);
        $scope.jobs = jobs.jobs;
    });
}
]);

我在上面的代码中得到了标题,但我不想在所有控制器中注入它。那么有适当的方法吗?一些单个配置代码将运行所有未来的资源请求或某种事件,只有在成功的资源响应时才能触发200 OK

4 个答案:

答案 0 :(得分:2)

试试interceptor

我不完全清楚你的逻辑。您可以注册拦截所有请求的全局拦截器:

angular.module('App', [])
       .config(function ($httpProvider){
            $httpProvider.interceptors.push(function() {
             return {
                   'response': function(response) {
                        var headers = response.headers();
                        some_function(headers.user);
                        return response;
                    }
             };
           });
       });

或只注册一个拦截器仅针对此查询的所有请求运行

app.service('$job', function($resource) {
    var job = $resource(service_base_url+'jobs.json/:id',{}, {
             'query': {
                         method:'GET', 
                         isArray:true,
                         interceptor: {
                              'response': function(response) {
                                      var headers = response.headers();
                                      some_function(headers.user);
                                      return response;
                               }
                          }
                      }
    });
    return job;
});

旁注:

  • 不应使用$前缀作为服务名称,因为它是为角度保留的,它可能与角度未来版本冲突。
  • 我猜你需要.factory而不是.service

答案 1 :(得分:0)

您可以在以下运行块中设置服务:

angular.module('myApp', [])
    .run(['$rootScope',  '$job',function ($rootScope, $job) {
        $rootScope.jobs = {};
        $rootScope.job_titles = {};
        $job.query(function(jobs,responseHeaders){
            var headers = responseHeaders();
            some_function(headers.user);
            $rootScope.jobs = jobs.jobs;
        });  

    }]);

您的服务是应用程序全局的唯一缺点

答案 2 :(得分:0)

我会去基地服务工厂。这将允许您在一个地方具有共同的服务相关功能

app.factory('ServiceBase', function () {
    function ServiceBase() {
      this.responseHeaders = function responseHeaders(resp){
         // todo
      };
    }
    return ServiceBase;
});

app.service('$job', function($resource, ServiceBase) {
  var service = function () {
    // $job related functions here
  };

  angular.extend(service, new ServiceBase());
  return service;
});

现在,ServiceBase中的任何内容都可供控制器和服务访问。这允许您具有通用功能,没有新的注入依赖项(在控制器上),并且易于进一步扩展。

答案 3 :(得分:-1)

我认为angularjs响应拦截器可以帮助你。