2016-09-10 3 views
2

を呼び出して、私は私は2つのコントローラがCTRL1を言う必要があり、この角度は、APIを減らす私はクラスを取得するためのAPI呼び出しを持って一つのサンプルアプリケーションを作成してい

appServices.service('classService', ['$http', '$q', 
    function($http,$q){ 
    this.getClass = function() { 

     var classes = $q.defer() 
     $http.get("http://localhost:8080/school/4/classes") 
     .then(function(data) { 
      classes.resolve(data) 
     }); 
     return classes.promise 
    } 
    }]) 

のためのサービスを作成している

http://localhost:8080/school/4/classes 

を言いますそして、CTRL2は、両方に私は私の問題は、2時間のAPI呼び出しが起こるのです

classService.getClass().then(function(data) { 
    $scope.classList = data.data.classes 
}) 

としてのサービスのためのコードを持っています私のデータが変更されないため、多くのAPIコールを1つに減らすことはできますか?それは冗長だとして、あなたが$qを使用してはならないこと、

app.service('classService', ['$http', function($http) { 
    this.getClass = function() { 
    return $http.get('data.json', { cache: true }).then(function(response) { 
     return response.data; 
    }); 
    }; 
}]) 

注:私はすでにcacheオプションを使用する{ cache: true }が、運と

おかげ

+0

あなたは、デバッグしようとしているあなたの 'コントローラ? 'classService.getClass()'メソッドが呼び出されているとき?場合によっては(不正なルーティングや不正なイベントバインディングのため)、メソッドが複数回呼び出されることがあります。だからあなたのこのコードは何の問題もないかもしれません。 – Paritosh

答えて

3

複数の呼び出しを防止するための最も簡単な方法をされて試してみました。場合

あなたが解決の約束への参照を格納することができますキャッシュをより細かく制御が必要な場合:

app.service('classService', ['$http', function($http) { 
    var promise 

    this.getClass = function() { 
    if (!promise) { 
     promise = $http.get('data.json').then(function(response) { 
     return response.data; 
     }); 
    } 

    return promise 
    }; 
}]); 

そして、最も柔軟性を持つもう一つのパターンを:

app.service('classService', ['$http', '$q', function($http, $q) { 
    var data; 

    this.getClass = function() { 
    return data ? $q.when(data) : $http.get('data.json').then(function(response) { 
     data = response.data; 
     return data; 
    }); 
    }; 
}])