2017-08-03 6 views
0

onInit関数で作成しているAPI呼び出しがあります。今onInitフックが複数回呼び出されたときにAngular 1.5で特定の約束を1回だけ呼び出す方法

vm.$onInit = function() { 
     var callInProgress = false; 
     var resultsLoaded = false; 

     var url = '/api/times/cst'; 
     if(callInProgress === false && resultsLoaded ===false){ 
      callInProgress = true; 
      HttpWrapper.send(url,{"operation":'GET'}).then(function(result){ 
       vm.times = result; 
       resultsLoaded = true; 
       },function(error){ 
       vm.errorInApi = true; 
      }); 
     } 

$onInitは、したがって、複数回のたびに初期化されているcallInProgress, resultsLoaded二つのフラグと呼ばれています。

したがって、このチェックは機能していません。

APIは、$onInitが呼び出されるたびに、初期化時に複数回呼び出されます。

どうすれば1回だけ電話をかけることができますか?しかし$onInitで呼び出されています。

+0

$ onInit()を何度も呼び出すのはなぜですか?もしそれがページ内の複数の指示から来たら、私はそれを見ることができました。 – rrd

+0

@rrdはい、そのようなものです。 – StrugglingCoder

+1

フルデータサービスを作成し、そのデータをサービスに格納し、データがまだ存在しない場合にのみ$ httpコールを行います。 –

答えて

3

IのようなサービスでAPI呼び出しをラップアドバイス:

(function (angular) { 
    'use strict'; 

    angular 
     .module('services.common') 
     .service('TimesService', TimesService); 

    TimesService.$inject = ['HttpWrapper']; 

    function TimesService(HttpWrapper) { 
     var timesService = this; 
     var timesResult = null; 

     timesService.getTimes = getTimes; 

     function getTimes() { 
      if (!timesResult) { 
       timesResult = HttpWrapper.send('/api/times/cst', {"operation": 'GET'}); 
      } 
      return timesResult; 
     } 

     return timesService; 
    } 

})(angular); 

してから、コントローラに注入し、TimesService.getTimes().then(...)のように使用するので、APIの呼び出しは最初の呼び出し時に一度だけ行われますTimesService.getTimes(結果はサービス内にtimesResultに格納されるため)。

0

callInProgressとresultsLoadedは、onInit関数とディレクティブコントローラの一部です。彼らはあなたが指示を使用するたびに作成されます。同様のことをするためにコントローラを含むコントローラーのプロパティーを使用することは、やり方です。バインディングを使用して、これをやや一般的にする必要があるコントローラプロパティを指定することができます。

+0

vm.callInProgressなどのコントローラのプロパティも初期化されています。だから今まで運がなかった – StrugglingCoder

+0

私は命令のインスタンスを含むコントローラを意味します。あなたは、それらのインスタンスが1つしかないどこかに収容される必要があります。 –

関連する問題