2016-10-27 4 views
1

私は2つのコントローラが並行してロードされており、コントローラAはサービスAを呼び出し、コントローラBはサービスBを呼び出します。コントローラBはコントローラAが要求しているデータを必要とします。 (コントローラAはコントローラであり、コントローラBではサービスAを呼び出せません)角度 - 他のコントローラの要求が完了するのを待っています

両方のサービスコール(Ctrl AとCtrl Bからの)が完了した後でのみ、コントローラBがデータを処理する最良の方法はありますか?

私は$ qの例のいくつかを見ましたが、私は上記の状況でそれを実装するのが少し混乱しています。

+1

あなたが何かをしようとしたことがありますか?私たちは、一般的には、仮説を扱っていないようにいくつかのコードを表示することを期待しています。また、サービスが呼び出されたコントローラに依存してはならないため、ここでは設計上の問題が発生する可能性があります。 –

+0

あなたの電話に手動で約束(例:$ q.defer)を追加する必要があります。彼らはトリッキーですが、ロジック部分を整理しているようです。良い点@MikeMcCaughan –

+0

サービスは、コントローラAから要求されているデータを必要とするコントローラBとは独立しています。このコードは、以下の最初の回答で述べたとおりです。私は時計を試して、それがうまくいくと以下の答えを受け入れるつもりです。ありがとう! –

答えて

1

私はあなたのケースを処理する前に両方のサービス変数が存在することを確認するコントローラBで$watchを1回使用して処理します。

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

これは私のために働いた!ありがとう! –

関連する問題