2016-07-14 46 views
2

为了在工厂调用中设置我的url的基础,我需要调用另一个工厂的方法来获取配置。下面不断抛出一个Provider 'reportService' must return a value from $get factory method.错误:将工厂注入另一个Angular工厂

.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'} 
     }); 
    }]); 
+0

我们可以看到serverService的代码吗? – jbrown

回答

1

你的工厂必须返回一些功能。在你的中,你已经定义了这个函数,但是没有返回它。

它更改为以下,

.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 
    }); 
+0

当我在该函数的前面添加'return'时,在我的IDE中得到'Expression或逗号预期'警告,未知的提供者:reportServiceProvider < - reportService < - reportQueueController'在控制台中。 – MattDionis

+0

@MattDionis我犯了一个语法错误。你能检查我编辑的答案吗? – Chinni

1

如果是factory方法,它应该返回的实例目的。只有当您将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. 工厂应该返回一个对象。

例:

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

所以当它注入到另一组成部分,它会返回对象的值。 !

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

然后消息将具有”的Hello World值”

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

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

    当运行上述我得到'reportService.getReportResults不是一个函数'。注意:我在'serverService.getConfiguration'里面移动了'var base = config.reporting.url;'。 – MattDionis

    +0

    您需要像调用'reportService.resource.getReportResults'一样调用 您能解释getConfiguration的作用吗?我认为如果它是一个配置,你可以把它放到一个JavaScript文件并导入它,而不是像那样调用异步。 –