将工厂注入另一个Angular工厂

时间:2016-07-14 12:55:31

标签: javascript angularjs

为了在工厂调用中设置我的URL的基础,我需要调用另一个工厂的方法来获取配置。以下内容不断引发Provider 'reportService' must return a value from $get factory method.错误:

.factory('reportService', ['$resource', 'serverService',
  function($resource, serverService) {

    serverService.getConfiguration().$promise.then(function(config) {
      var base = config.reporting.url;
      return $resource(base, {}, {
        getReportResults: {method: 'POST', url: base + '/api/reports/:id/versions/:version'}
      });
    });
  }])

Server服务:

angular.module('app')
  .factory('serverService', ['$resource',
    function($resource) {
      var base = '/api/server/';
      return $resource(base, {}, {
        getConfiguration: {method: 'GET', url: base + 'configuration'}
      });
    }]);

2 个答案:

答案 0 :(得分:1)

您的工厂必须返回某些功能。在reportService中,您已定义了该函数但未将其返回。

将其更改为以下内容,

.factory('reportService', ['$resource', 'serverService',
    function($resource, serverService) {
        return {
            function_one(): function() {
                return serverService.getConfiguration().$promise.then(function(config) {
                    var base = config.reporting.url;
                    return $resource(base, {}, {
                        getReportResults: {method: 'POST', url: base + '/api/reports/:id/versions/:version'}
                    });
                });      
            }, //add how many ever functions you want by separating with comma
            function_two: function() {
                // your second function
            }
        };
}]);

现在,您可以在任何控制器中按如下方式访问所需的功能

reportService.function_one()
  .then(function (response) {
      // your logic
  });

答案 1 :(得分:1)

如果它是factory方法,它应该返回一个object实例。只有当你require/inject到另一个组件时才会调用它。

在这种情况下,您的return位于内部函数内部,因此函数不会返回任何项目。

应该是这样的:

.factory('reportService', ['$resource', 'serverService',
  function($resource, serverService) {
    var base = config.reporting.url;
    function ReportService() {
      serverService.getConfiguration().$promise.then(function(config) {
        this.resource = $resource(base, {}, {
          getReportResults: {method: 'POST', url: base + '/api/reports/:id/versions/:version'}
        });
      }.bind(this));
    }
    return new ReportService()
  }])

更多解释:

  1. 工厂应该返回一个物体。
  2. 例如:

    .factory('message', function () {
      return "Hello World!"
    }
    

    因此,当它被注入到其他组件时,它将具有返回对象的值。

    .controller('something', ['$scope', 'message', function ($scope, message) {}]);
    

    然后消息将具有' Hello World!"

    的价值
    1. 内功能的回归不会计数。
    2. 例如:

      .factory('message', function () {
        http.get(...).then(function (data) {
          return "Hello World!"
        });
      }