2017-03-13 2 views
0

Ich versuche herauszufinden, wie TypeScript in einer vorhandenen Angular 1.5 App verwendet werden kann. Ich kann nicht herausfinden, wie man benutzerdefinierte Dienste injiziert. Angular Services und 3rd Party Services funktionieren gut. Die Dienste, die ich injizieren muss, sind noch Vanilla JS-Dienste. Im folgenden Beispiel muss ich reportService injizieren.Angular 1 Dependance Injection mit JavaScript und TypeScript

Der Fehler, den ich bekomme, ist getReportById ist keine Funktion.

class ReportController implements IReportController { 

    static $inject = ['$stateParams', 'reportService']; 


    constructor(private $stateParams: angular.ui.IStateParamsService, private reportService) { 

     this.getReport($stateParams.id); 
    } 

    getReport(id: number): object { 
     reportService.getReportById(id) 
      .then(function(res) { 
       console.log(res) 
      }); 
    } 

} 

Hier ist der Service.

angular.module('reportsServiceModule', []) 
    .factory('reportsService', [ 
     '$http', 
     reportsService 
    ]); 

function reportsService(
     $http 
) { 

    'use strict'; 

    var service = {}; 

    service.getReportById = function(reportID) { 
     return 'A promise'; 
    }; 

    return service; 
} 
+0

sein Und was ist Report? – estus

+0

reportService ist ein regulärer eckiger 1-Dienst (könnte ein beliebiger Dienst sein), der in JavaScript (kein TypeScript) geschrieben ist. –

+0

Bitte geben Sie den Code dafür an. Es ist wichtig. Für jeden Dienst können Sie 'any'-Typ verwenden, aber Sie werden auf diese Weise nicht von TS profitieren. Haben Sie besondere Probleme mit dem obigen Code? – estus

Antwort

1

Der einzige wirkliche Unterschied zwischen JS und TS Entwicklung in AngularJS ist, dass die Einheiten getippt werden können. Dies hat nur Auswirkungen auf die Sicherheit des Typs.

Hier wäre es

interface IReportService { 
getReportById: (someType) => string; 
} 

... 
constructor(
    private $stateParams: angular.ui.IStateParamsService, 
    private reportService: IReportService 
) { 
... 

Es gibt kein Problem mit Dependency Injection sein. Wenn Sie ein DI-Problem in Angular haben, erhalten Sie einen Fehler von Injector.

Das eigentliche Problem hier ist, dass strikte Modus nicht verwendet wird. Mit use strict Anweisung oder alwaysStrict TS option würde der Fehler zeigen, was wirklich falsch ist - Variable ist nicht in getReport Methode definiert.

Stattdessen sollte es

getReport(id: number): object { 
    this.reportService.getReportById(id) 
    ... 
+0

Danke, das habe ich später am Tag herausgefunden und das war das Problem. Ich hatte auch ein Bestellproblem mit meinem Konstruktor, ich hatte eine andere Variable hinzugefügt, die oben nicht gezeigt wurde und wusste nicht, dass es auch die Injektion brechen könnte. –

0

Es ist ein Tippfehler.

Sie definiert einen Bericht s Dienst

.factory ('reportsService')

Aber injiziert eine andere

static $ inject = [ '$ stateParams ',' reportService '];

+0

Es stimmt, dass es einen Tippfehler gibt. Es wurde jedoch in der Frage gemacht, nicht im ursprünglichen Code. Sonst gäbe es einen DI Fehler, nicht 'getReportById ist keine Funktion'. – estus

Verwandte Themen