2014-09-25 56 views
0

我在我的单页面角应用程序中实现了资源,该应用程序触发了我的REST客户端服务器。我为每个资源提供了不同的服务。现在,我的REST服务器正在发送一个响应头中的值,现在我想知道从头中检索该值的正确方法。适用于资源成功查询的Angular JS全局配置

我的服务代码:

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时才会触发

+0

您是否尝试在运行块中设置呼叫? – Whisher 2014-09-25 13:33:34

+0

没有什么呢?我是新来的角 – 2014-09-25 13:34:01

回答

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
+0

谢谢,拦截器为我工作 – 2014-09-26 12:35:01

-1

我认为angulrjs响应拦截器可以帮助你做到这一点。

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; 
     }); 

    }]); 

唯一的缺点你的服务是全球性的应用

+0

我不能使用这个,因为我有近20个服务,我不能注入相同的代码,拦截器在这里工作? – 2014-09-25 13:50:54

+0

@ntechi:这只会在应用程序启动时运行'once once',每次发出请求时都不会再次运行。 – 2014-09-25 14:02:53

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什么是控制器和服务进行访问。这允许您具有通用功能,没有新的注入依赖性(在控制器上),并且很容易进一步扩展。