2014-09-25 36 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什麼是控制器和服務進行訪問。這允許您具有通用功能,沒有新的注入依賴性(在控制器上),並且很容易進一步擴展。