2016-07-14 15 views
2

Um die Basis meiner URL in einem Factory-Call zu setzen, muss ich eine andere Fabrik Methode aufrufen, um die Konfig zu bekommen. Die unten hält werfen ein Provider 'reportService' must return a value from $get factory method. Fehler:Injection factory in eine andere Angular 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'} 
     }); 
    }); 
    }]) 

serverService:

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

Können wir den Code für serverService sehen? – jbrown

Antwort

1

Ihr Werk muss eine Funktion zurück. Hier in Ihrer haben Sie die Funktion definiert, aber nicht zurückgegeben.

ändern es zu folgenden

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

Jetzt können Sie Ihre gewünschte Funktion zugreifen, wie in jedem Controller folgt,

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

Wenn ich 'return' vor dieser Funktion hinzufüge, bekomme ich eine 'Ausdruck oder Komma erwartet' Warnung in meiner IDE und einem 'Unbekannter Provider: reportServiceProvider <- reportService <- reportQueueController' in der Konsole. – MattDionis

+0

@MattDionis Ich habe einen Syntaxfehler gemacht. Können Sie meine bearbeitete Antwort überprüfen? – Chinni

1

Wenn es sich um eine factory Methode, sollte es eine Instanz zurückzukehren Objekt. Und es wird nur aufgerufen, wenn Sie es zu einer anderen Komponente require/inject.

In diesem Fall befindet sich Ihre return in der inneren Funktion, so dass die Funktion kein Projekt zurückgibt.

Es sollte so aussehen:

.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() 
    }]) 

Mehr explaination:

  1. eine Fabrik soll ein Objekt zurückgeben.

Ex:

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

so, wenn es um Anthere Komponente eingespritzt ist, wird der Wert des zurückgegebenen Objekts haben. !

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

dann Nachricht wird Wert von ‚Hallo Welt haben“

  1. Rückkehr in innere Funktion nicht zählen

Bsp.:

+0

Wenn ich das obige ausführe, bekomme ich 'reportService.getReportResults ist keine Funktion'. Hinweis: Ich habe 'var base = config.reporting.url;' in 'serverService.getConfiguration' verschoben. – MattDionis

+0

Sie müssen wie 'reportService.resource.getReportResults' aufrufen können Sie erklären, was getConfiguration tun? Ich denke, wenn es eine Konfiguration ist, können Sie es in eine Javascript-Datei einfügen und importieren, anstatt async so aufzurufen. –

Verwandte Themen