如何从各种角度控制器调用角度服务

时间:2014-12-30 21:00:56

标签: javascript angularjs

我是角度js的新手并试图想出一种在控制器中调用以下服务的方法。该服务定义如下。

app.factory('myappFactory', ['$http', function($http) {

  var data = {};

  data.getmyServiceData = function() {
    return $http.get('http://..')
  }

  return data;
}]);

此服务已在一个角度控制器上调用。我想在不同的控制器中调用它,但不想调用实际服务,而是使用从前一个调用接收的数据。如何更改它以便我可以在不同的控制器中调用工厂?

2 个答案:

答案 0 :(得分:0)

您可以在服务中使用承诺:

app.factory('appFactory',function($http,$q) {
    var data_q = $q.defer();
    var service = {
      getData: getData
    }

    $http.get('http').then(function(response) {
      data_q.resolve(response.data);
    })

    return service;

    function getData() {
      return data_q.promise;
    }
});

在你的控制器中:

app.controller('AppCtrl',function($scope,appFactory) {
  appFactory.getData().then(function(data) {
    $scope.data = data;
  })
})

答案 1 :(得分:0)

您只需将其包含在控制器的依赖项中:

app.controller('MyController', ['$scope', 'myappfactory', 
                                                   function($scope, myappfactory) {
    myappfactory.getmyServiceData().then(function (data) {
        $scope.data = data.data;
    });       
}]);

为了进行一些改进,您可能会考虑让工厂返回一个在返回数据之前解包数据的函数:

app.factory('myappFactory', ['$http', function($http) {
  return function() {
      return $http.get('http://..', { cache: true }).then(function (data) {
          return data.data;
      };
  };
}]);

然后你可以像这样使用它:

app.controller('MyController', ['$scope', 'myappfactory', 
                                                   function($scope, myappfactory) {
    myappfactory().then(function (data) {
        $scope.data = data.data;
    });       
}]);