2017-08-03 67 views
0

我在onInit函数上有一个API调用。如何在多次调用onInit钩子时在Angular 1.5中只调用一次特定承诺

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正在每次初始化的两个标志。

所以,检查是有点不工作。

每次调用$onInit时都会调用API,初始化时会多次调用API。

我该如何拨打一次电话? 虽然它已被$onInit调用。

+0

为什么要$多次调用$ onInit()?如果它来自一个页面中的多个指令,那么我可以看到... – rrd

+0

@rrd就是这样的。 – StrugglingCoder

+1

创建完整的数据服务,将数据存储在服务中,并且只在数据尚未存在时进行$ http调用。 –

回答

3

我建议包装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

我的意思是在包含指令实例的控制器上。你需要把他们安置在某个地方,那里只有他们的一个实例。 –

相关问题