如何创建一个使用http.get的工厂并将其以角度传递给多个控制器

时间:2014-07-31 22:40:31

标签: javascript angularjs

我有一个angularjs应用程序变得越来越复杂,所以我需要将事物分解为多个控制器。我需要创建一个工厂来使用http.get获取我的数据,并在几个控制器之间共享该数据。我有一个简单的版本将数据传递到控制器,但我不确定使用http.get的工厂。另外,我想确保http.get只被调用一次,对于工作示例代码,请参阅this plunker

var myApp = angular.module('myApp', []);

myApp.factory('Data2', function($http){
  var getDataUrlString = "myhappyurl.com";

  return $http.get(getDataUrlString);
})

myApp.factory('Data', function(){
  return {message:"cool data from factory"}
})

myApp.controller('firstController', function($scope, Data){
  $scope.firstData = Data;
})

myApp.controller('secondController', function($scope, Data){
  $scope.secondData = Data;
})

我认为我非常接近我想要使用的工厂' Data2'。刚返回字符串消息的数据工厂工作得很好,正如您在我提供的示例代码中看到的那样,我只需要帮助弥合从简单字符串到http.get的差距。

1 个答案:

答案 0 :(得分:2)

您的工厂Data2会返回一个承诺,因此您需要在承诺解决/拒绝后访问响应: -

 myApp.controller('firstController', function($scope, Data2){

   Data2.then(function(response){
        $scope.firstData = response.data;
   }).catch(function(error){
      //handle error
   });
 });

请注意,由于您将promise作为工厂实例返回,而工厂是单例,因此每次都不会实例化,这意味着您将始终获得相同的承诺,并且不会一次又一次地调用url。您可能希望将其包装在函数中,并使用带有函数引用的键从工厂返回一个对象。