2016-10-27 32 views
1

我有兩個並行加載的控制器,控制器A調用服務A和控制器B調用服務B.控制器B需要控制器A請求的數據。 (注意:控制器A是一個通用控制器,所以我不能在控制器B中調用服務A)Angular - 等待其他控制器請求完成

只有在服務調用(從Ctrl A和Ctrl B)完成後,控制器B才能處理數據的最佳方法是什麼?

我看到一些$ q的例子,我有點困惑在上述情況下實現它。

+1

你有沒有嘗試過的東西?我們通常希望你展示一些代碼,以便我們不處理假設。此外,您可能在這裏有一個設計問題,因爲服務不應該依賴於從哪個控制器調用它們。 –

+0

可能需要爲呼叫添加手動承諾(例如$ q.defer)。他們很棘手,但似乎你已經理清了邏輯部分。好點@MikeMcCaughan –

+0

服務是獨立的,其控制器B需要從控制器A請求的數據。代碼看起來與下面第一個答案中提到的完全一樣。如果它有效,我將嘗試手錶並接受下面的答案。謝謝! –

回答

1

我會在控制器B中使用一次$watch來處理您的情況,以確保兩個服務變量在繼續之前存在。

angular.module('test', []) 
 
    .controller('ControllerA', ControllerA) 
 
    .controller('ControllerB', ControllerB) 
 
    .factory('ServiceA', ServiceA) 
 
    .factory('ServiceB', ServiceB); 
 

 
function ControllerA($scope, ServiceA) { 
 
    $scope.a = 'a'; 
 
    
 
    ServiceA.getString().then(function(){ 
 
    $scope.a = ServiceA.str; 
 
    }); 
 
} 
 

 
function ControllerB($scope, ServiceA, ServiceB) { 
 
    $scope.b = 'b'; 
 
    $scope.ab = 'ab'; 
 
    
 
    ServiceB.getString().then(function(){ 
 
    $scope.b = ServiceB.str; 
 
    }); 
 
    
 
 // --- this part is the answer --- 
 
    var watch = $scope.$watchCollection(function(){ 
 
    return [ServiceA.str, ServiceB.str]; 
 
    }, function(){ 
 
    if (!ServiceA.str || !ServiceB.str) return; 
 
    
 
    $scope.ab = ServiceA.str + ' and ' + ServiceB.str; 
 
    watch(); // unregister watch 
 
    }); 
 
    // --- end answer --- 
 
} 
 

 
function ServiceA($timeout, $q) { 
 
    var service = { 
 
    str: "", 
 
    getString: getString 
 
    } 
 
    
 
    return service; 
 
    
 
    function getString() { 
 
    var d = $q.defer(); 
 
    
 
    $timeout(function(){ 
 
     service.str = "I'm string A"; 
 
     d.resolve(); 
 
    }, Math.random() * 3000); 
 
    
 
    return d.promise; 
 
    } 
 
} 
 

 
function ServiceB($timeout, $q) { 
 
    var service = { 
 
    str: "", 
 
    getString: getString 
 
    } 
 
    
 
    return service; 
 
    
 
    function getString() { 
 
    var d = $q.defer(); 
 
    
 
    $timeout(function(){ 
 
     service.str = "I'm string B"; 
 
     d.resolve(); 
 
    }, Math.random() * 3000); 
 
    
 
    return d.promise; 
 
    } 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script> 
 

 
<div ng-app='test'> 
 
    <div ng-controller="ControllerA">{{a}}</div> 
 
    <div ng-controller="ControllerB"> 
 
    {{b}} 
 
    <br>{{ab}} 
 
    </div> 
 
</div>

+0

這對我有效!謝謝! –