2016-07-14 92 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文件並導入它,而不是像那樣調用異步。 –