4

這應該是一個相當直接的問題,但我很難過。Angular:呼叫服務一旦多個控制器

我有一個服務,使http調用,然後做廣泛的結果後處理。我希望將處理後的結果分配給$ scope.variable並在幾個不同的視圖中使用。事情是我爲每個視圖都有單獨的控制器,但我不希望每個控制器都調用該服務以從資源獲取相同的數據併爲每個控制器進行一次後處理。

超級簡化我有這樣的:

myModule.factory ('Data', function ($http, $q) { 
    getData: $http.get... 
    processData: this.getData().success(function(data){ 
    ... do a ton of cpu intensive processing ... 
    return processed_data 
ctrl1 = function(Data,$scope) { 
    $scope.data = Data.processData() 
    } 
ctrl2 = function(Data,$scope) { 
    $scope.data = Data.processData() 
etc... 
} 

很顯然,我想設置$ scope.data = Data.processData()只有一次,並讓它在所有的控制器填充。就目前而言,每個控制器都會獨立調用服務,這會產生不必要的流量和CPU。

我敢肯定,有一些簡單的,但我不明白。有什麼方法可以創建一個「超級」範圍,我可以定義所有控制器範圍通用的變量?

謝謝,

+0

您可以通過創建服務在控制器之間共享數據[如此處所述](http://stackoverflow.com/questions/12008908/pass-variables-between-controllers) – Gloopy

回答

6

我看到你注射了$q service。爲什麼不在數據服務中返回一個承諾(就像$http.get...),以解決CPU密集處理何時完成?你也可以做像angular $resource service並返回一旦處理完成的是被填充一個空對象(在下面的例子中,我假設processed_data是一個數組,但它也將工作對象):

myModule.factory ('Data', function ($http, $q) { 
    var deferred = $q.defer(); 
    var futureResult = []; 
    //will get populated once processing is done, and is basically a cache 

    $http.get('url').success(function(data){ 
    //... do a ton of cpu intensive processing ... 
    for(var i=0; i<processed_data.length; i++){ 
     futureResult[i] = processed_data[i]; 
    } 
    deferred.resolve(futureResult); 
    }); 

    return { 
    getProcessedDataPromise:function(){ 
    return deferred.promise; 
    } 
    ,getProcessedData:function(){ 
     return futureResult; 
    } 
    } 
}); 

在控制器中

ctrl1 = function(Data,$scope){ 
    Data.getProcessedDataPromise().then(function(data){ 
    $scope.data = data; 
    }); 
} 
ctrl2 = function(Data,$scope){ 
    $scope.data = Data.getProcessedData(); 
} 

你也可以看看this plnkr example