Javascript 将工厂注入另一个角工厂

Javascript 将工厂注入另一个角工厂,javascript,angularjs,Javascript,Angularjs,为了在工厂调用中设置url的基础,我需要调用另一个工厂的方法来获取配置。下面不断抛出一个提供程序“reportService”必须从$get factory方法返回一个值。错误: .factory('reportService', ['$resource', 'serverService', function($resource, serverService) { serverService.getConfiguration().$promise.then(function(con

为了在工厂调用中设置url的基础,我需要调用另一个工厂的方法来获取配置。下面不断抛出一个
提供程序“reportService”必须从$get factory方法返回一个值。
错误:

.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'}
      });
    });
  }])
服务器服务:

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

您的工厂必须返回一些功能。在您的
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
  });

如果它是
工厂
方法,它应该返回对象的实例。只有当您
需要/注入它到另一个组件时,它才会被调用

在这种情况下,
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()
  }])
更多解释:

  • 工厂应该返回一个对象
  • 例:

    所以,当它被注入另一个组件时,它将有一个返回对象的值

    .controller('something', ['$scope', 'message', function ($scope, message) {}]);
    
    然后消息将具有“你好,世界!”!"

  • 内部函数中的返回不计算在内
  • 例:


    我们可以看到serverService的代码吗?当我在该函数前面添加
    return
    时,我在IDE中得到一个
    表达式或预期的逗号
    警告和一个
    未知的提供程序:reportServiceProvider@MattDionis我犯了一个语法错误。你能检查我编辑过的答案吗?运行上述函数时,我得到
    reportService.getReportResults不是一个函数。注意:我把
    var base=config.reporting.url;
    移到了
    serverService.getConfiguration
    中。你需要像
    reportService.resource.getReportResults.getReportResults>那样调用它。你能解释一下getConfiguration做什么吗?我想如果它是一个配置,你可以把它放到一个javascript文件中,然后导入它,而不是ca像那样异步。
    
    .controller('something', ['$scope', 'message', function ($scope, message) {}]);
    
    .factory('message', function () {
      http.get(...).then(function (data) {
        return "Hello World!"
      });
    }