2016-05-03 34 views
0

私は$ httpサービス用の角度ファクトリを作成しました。

app.factory('myService', function ($http, $q) { 

var deferred = $q.defer(); 
var responseData = null; 
var obj = {}; 

obj.getData = function(){ 
    $http.get('test.json').success(function(response){ 
     responseData = response; 
     deferred.resolve(responseData); 
    }).error(function(response){ 
     deferred.reject(responseData); 
    }); 

    return deferred.promise; 
} 

obj.myData = function(){ 
    return responseData; 
} 

return obj; 
}); 

コントローラ:私は、ブラウザでのネットワークタブを確認したときに、HTTPリクエストが二回

工場作られて、私は応答とコントローラで同じを使用することを取得していますが、問題は次のとおりです。

app.controller('myController', function($scope,myService){ 

myService.getData().then(function(){ 
    $scope.myDetails = myService.myData(); 
}); 

}); 

私のアプローチでは間違っています。あなたが$httpを返すことができます私のソリューション

+1

私は、このようにすべてをそれをしないでしょうがそこに私にとっては大丈夫です。あなたのアプリケーションで "myController"を2回バインドしていないことは確かですか? – Walfrat

答えて

-1

を提供してくださいませんdeferred.promise

+0

これはOPの質問に答えるかもしれませんが、それはかなり短く、これが理由と理由を説明するために拡張できると思います。 – brandonscript

1

あなたはキャッシングのシナリオを作っている方法は非常に複雑で、本当に便利ではありません。データが既に読み込まれているかどうかをどのように知っていますか?

単純なキャッシングサービスを作成して、1つのポイント(コードラインの数が下がる)でキャッシングを処理できます。

angular.module("YourApp").factory("CachingService", [ 
    "$q", 
    "$http", 
    function ($q, $http,) { 
     var cache = {}; 

     return { 
      getFromCache: getFromCache 
     }; 


     function getFromCache(url) { 
      var deferred = $q.defer(); 

      if (cache[url]) { 
       deferred.resolve(cache[url]); 
      } else { 
       return $http.get(url).then(function (result) { 
        cache[url] = result; 
        return result; 
       }); 
      } 
      return deferred.promise; 
     } 
    } 
]); 

そして、あなたは単にあなたの他のサービスの内部でそれを呼び出す:あなたのコントローラの内部で、その後、

angular.module("YourApp").factory("myService", [ 
    "CachingService", 
    function(CachingService){ 
     return { 
      getData: getData 
     }; 

     function getData(){ 
      return CachingService.getFromCache("test.json"); 
     } 
    } 
]); 

そして:

app.controller('myController', function($scope,myService){ 

    myService.getData().then(function(result){ 
     $scope.myDetails = result.Data; 
    }); 

}); 
関連する問題