我已在我的单页角应用程序中实现了资源,该应用程序将激活到我的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
答案 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响应拦截器可以帮助你。