2017-06-17 79 views
0

我有叫DashboardCtrl父控制器的應用程序,以及多個子控制器(DashboardBuyerCtrl,DashboardSellerCtrl ...)API請求1

我希望能夠分享的結果不同控制器之間的HTTP請求。 目前,我在每個控制器中執行我的HTTP請求,但我認爲這不是理想的性能。 我讀過,我應該使用服務,但我卡在這裏。

任何人都可以幫忙嗎?

感謝

回答

1

使用服務時,一般來說,一個很好的做法,因爲可幫助您組織和共享在你的應用程序的代碼,我創建了一個小的應用程序來展示如何創建和控制器重用的服務:

var app = angular.module('testApp', []); 
 

 
app.controller('ctrlA', function($scope, getIp) { 
 
    getIp().then(function(resp) { 
 
    $scope.data = resp.data.origin; 
 
    }); 
 
}); 
 

 
app.controller('ctrlB', function($scope, getIp) { 
 
    getIp().then(function(resp) { 
 
    $scope.data = resp.data.origin; 
 
    }); 
 
}); 
 

 
app.service('getIp', function($http) { 
 
    return function() { 
 
    return $http.get('https://httpbin.org/ip'); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="testApp"> 
 
    <div ng-controller="ctrlA"> 
 
    First controller 
 
    <p>IP: {{data}}</p> 
 
    </div> 
 
    <div ng-controller="ctrlB"> 
 
    Second controller 
 
    <p>IP: {{data}}</p> 
 
    </div> 
 
</div>

至於性能,我想如果內容沒有被經常更新(或人沒有更新建議使用caching選項l),如下所示:

$http({ 
    url: '...', 
    method: 'GET', 
    cache: true 
}); 

這將保存請求的響應以供將來使用。

您可以在official documentation中閱讀更多關於服務的內容。

+0

感謝您的非常完整的答案。我還有一個問題。在我的情況下,ctrlB是ctrlA的孩子,即使我的內容經常更新,但我知道當我在ctrlB中使用內容時,它將與ctrlA中的內容相同。我還應該撥打服務兩次嗎?在你提供的例子中,假設你沒有獲取IP,但是有一些更加動態的東西(比如說當前的日期)你真的會打兩次服務嗎?我們不應該「分享」兩個控制器之間的內容嗎? –

+0

不客氣,如果您需要共享父母之間的數據,您應該使用[組件](https://docs.angularjs.org/guide/component),因爲它允許正確的嵌套和參數傳遞。請記住,單向流量(從父母到孩子)是嚴格建議的,對於雙向流量,您仍然應該使用服務。此外,所有服務都是單例,這意味着如果你在其中設置變量,它將保持原樣,並且可以被修改或/從任何其他源(當前日期是這樣)檢索。如果您有任何其他問題,請告訴我! –

+0

感謝您的及時答覆。我將開始挖掘組件。 –