2016-08-02 26 views
1

私はディレクティブで複数回呼び出されるこのファクトリを持っています。それは多くのデータを返すので、最後のレンダリングは遅いです。 2回目とn回目と呼ばれるときに、どうすればいいですか?ファクトリ関数を一度呼び出す

appBMdata.factory('Trends',['$http','Config','$q', 
    function($http,Config,$q){ 


      function getAllData() { 
      var source1 = $http.get(Config.api_server + 'bizmonitor/indicators/get/2016'); 
      var source2 = $http.post(Config.api_server + 'trends'); 

      return $q.all([source1, source2]); 

      }; 

      return { 
      getAllData : getAllData, 
      };  
    }]); 

答えて

1

あなたはVarの約束を保存し、それがすでに設定されている場合は、それを返すことができます。

appBMdata.factory('Trends',['$http','Config','$q', 
    function($http,Config,$q){ 

     var _cacheGetAllData; 
     function getAllData() { 
      var source1 = $http.get(Config.api_server + 'bizmonitor/indicators/get/2016'); 
      var source2 = $http.post(Config.api_server + 'trends'); 

      _cacheGetAllData = _cacheGetAllData || $q.all([source1, source2]); 
      return _cacheGetAllData; 
     } 

     return { 
      getAllData : getAllData, 
     };  
}]); 

あなたは連続した呼び出しが更新するように強制する場合は、あなたのような何かにそれを編集することができますこの:

appBMdata.factory('Trends',['$http','Config','$q', 
    function($http,Config,$q){ 
    var _cacheGetAllData; 
    function getAllData(ignoreCache) { 
     var source1 = $http.get(Config.api_server + 'bizmonitor/indicators/get/2016'); 
     var source2 = $http.post(Config.api_server + 'trends'); 

     if (ignoreCache) {_cacheGetAllData = undefined;} 
     _cacheGetAllData = _cacheGetAllData || $q.all([source1, source2]); 
     return _cacheGetAllData; 
    } 

    return { 
     getAllData : getAllData, 
    };  
}]); 
1

はいあなたは$rootScope上のデータを保持し、そのが複数回呼び出されたときに、そこからデータを返すことができます。

appBMdata.factory('Trends',['$http','Config','$q','$rootScope' 
    function($http,Config,$q,$rootScope){ 


      function getAllData() { 
      var source1 = $http.get(Config.api_server + 'bizmonitor/indicators/get/2016'); 
      var source2 = $http.post(Config.api_server + 'trends'); 

      return $q.all([source1, source2]); 

      }; 
      if($rootScope.data){    // check if data already present 
      $rootScope.data=getAllData(); // assign data to rootscope 
      } 
      return { 
      getAllData : $rootScope.data, //return data from rootscope 
      }; 
    }]); 
+0

私がサービスTrends.getAllData()を呼び出すときにコードを更新した後、「Trends.getAllDataは関数ではありません」というエラーが表示されます。私はサービスを呼び出すべき別の方法がありますか? –

+0

@AntonioGocaj ..「Trends.getAllData」と呼ぶべきである。 –

+0

@AntonioGocaj ..申し訳ありませんが、私は入力ミスを修正しました。 –

1

私はサービスでそれを解決し、データがあればそれを約束してデータを返します。データを再度フェッチする場合は、最初の引数としてtrueを追加します。

appBMdata.factory('Trends', ['$http', 'Config', '$q', function($http, Config, $q) { 

    var data; 

    function getAllData(nocache) { 

     var deferred = $q.defer(); 

     if (data.length && !nocache) { 

      deferred.resolve(data); 

     } else { 

      var source1 = $http.get(Config.api_server + 'bizmonitor/indicators/get/2016'); 
      var source2 = $http.post(Config.api_server + 'trends'); 

      $q.all([source1, source2]) 
       .then(function (values) { 
        data = values; 
        deferred.resolve(data); 
       }) 
       .catch(function (err) { 
        deferred.reject(err); 
       }); 
     } 

     return deferred.promise; 

    } 

    return { 
     getAllData : getAllData 
    }; 

}]); 
関連する問題